[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'。

复杂声明定义简单别名

  1. 原声明:'int (a[5])(int, char);'
    变量名为'a',直接用一个新别名'pFun'替换a就可以了:
    'typedef int (pFun)(int, char
    );'
    原声明的最简化版:
    'pFun a[5];'

  2. 原声明:'void (b[10]) (void ()());'
    变量名为'b',先替换右边部分括号里的,'pFunParam'为别名一:
    'typedef void (pFunParam)();'
    再替换左边的变量'b','pFunx'为别名二:
    'typedef void (
    pFunx)(pFunParam);'
    原声明的最简化版:
    'pFunx b[10];'

  3. 原声明:'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 (
)[]'数组指针

posted @ 2019-11-18 10:09  LiaoLanHYY  阅读(47)  评论(0)    收藏  举报