[C++] typedef使用四则
定义类型别名;
'''c++
typedef char* PCHAR;
PCHAR a, b;
'''
结构体别名;
'''c++
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1;
'''
定义与平台无关的类型
用'typedef'来定义与平台无关的类型。
比如定义一个叫'REAL'的浮点类型,在目标平台一上,让它表示最高精度的类型为:
'typedef long double REAL;'
在不支持'long double'的平台二上,改为:
'typedef double REAL;'
在连 double 都不支持的平台三上,改为:
'typedef float REAL; '
也就是说,当跨平台时,只要改下'typedef'本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如'size_t'。
复杂声明定义简单别名
-
原声明:'int (a[5])(int, char);'
变量名为'a',直接用一个新别名'pFun'替换a就可以了:
'typedef int (pFun)(int, char);'
原声明的最简化版:
'pFun a[5];' -
原声明:'void (b[10]) (void ()());'
变量名为'b',先替换右边部分括号里的,'pFunParam'为别名一:
'typedef void (pFunParam)();'
再替换左边的变量'b','pFunx'为别名二:
'typedef void (pFunx)(pFunParam);'
原声明的最简化版:
'pFunx b[10];' -
原声明:'doube()() (e)[9]; '
变量名为e,先替换左边部分,'pFuny'为别名一:
'typedef double(pFuny)();'
再替换右边的变量e,'pFunParamy'为别名二
'typedef pFuny (pFunParamy)[9];'
原声明的最简化版:
'pFunParamy e;'
理解复杂声明可用的“右左法则”:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
'int (func)(int p);'
首先找到变量名func,外面有一对圆括号,而且左边是一个号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int类型的形参,返回值类型是int。
'int (func[5])(int );'
'func'右边是一个'[]'运算符,说明'func'是具有5个元素的数组;'func'的左边有一个'',说明'func'的元素是指针(注意这里的''不是修饰'func',而是修饰'func[5]'的,原因是'[]'运算符优先级比''高,'func'先跟'[]'结合)。跳出这个括号,看右边,又遇到圆括号,说明'func'数组的元素是函数类型的指针,它指向的函数具有'int*'类型的形参,返回值类型为'int'。
也可以记住2个模式:
'type ()(....)'函数指针
'type ()[]'数组指针

浙公网安备 33010602011771号