今天在学习sizeof的时候偶遇typedef这个关键字,抱着不弄明白不死心的心态,在网上搜了些资料,加上自己的理解写下这篇typedef,权当自己用来见证自己进步和备忘的。
typedef 照我理解就是取别名。
取别名一:
typedef char * SChar;
这里给char * 类型的指针重新取了哥SChar的别名,则在以后的代码中要定义Char * 就可以这样写 SChar 如:
char * a 等价于 SChar a;
为结构体取别名:
typedef struct test1
{
char a;
}Test;
则 Test代表了 Struct test1,
Test a 等价于 struct test1 a;
取别名三,通过取别名实现平台兼容性:
例如:
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
取别名四:为复杂函数指针或者类型取一个语义简单明了的别名。
如:定义函数指针时可以这样定义: int (*fn1)(int *p);如果这样写就是定义了一个名字为fn1的指向一个返回类型为int,参数类型为int指针的函数指针,如果接下来还要定义一个类似的函数指针还得这样写int (*fn2)(int *p),这样写可读性和修改性不是很强。如果我们用typedef 就解决了以上问题。
typedef int (* pFn)(int *p);
pFn fn1;
pFn fn2;
以上等价于上面的定义了两个函数指针。显然这样写代码的可读性明显提高了很多,同时,如果pFn指针的类型变了的话也只要修改typedef处代码即可。