类型重命名
typedef可以用来给一个类型重命名,给复杂的类型取个简单的别名可以简化我们的代码,用define语句也可以完成这项任务,但是尽量使用typedef而不要使用define,因为typedef使用起来相对安全一些,define语句可能会出现问题,比如:
#define PINT int*
PINT a,b,c;
我们想将int*类型替换成PINT,然后定义三个int*类型的变量a,b,c;而实际上,使用define语句编译器只会进行简单的替换,上面的语句相当于是:
int* a,b,c;
最终的结果是只有变量a是int*类型的,变量b,c都是int类型的,而如果使用typedef语句:
typedef int* pint;
pint a,b,c;
则会成功的定义三个Int*类型的变量。
误区
我之前对typedef的理解,有一个误区,不知道大家有没有遇到过,我以为typedef和define的使用方法很相似,define语句这样用:
#define 别名 原类型名
而typedef我一直是这样用的:
typedef 原类型名 别名
就这样用了很长时间,直到后来我见到这样一句代码:
typedef void (*fun)();
怎么也理解不了这句代码,然后上网查了资料才知道这句代码将返回值是void的无参的函数指针类型重定义为fun,理解了typedef的正确用法,其实这句代码很简单。
正确理解
正确理解typedef,最关键的一点是将后面的语句看成一个整体而不是两部分,它后面跟的是一个完整的声明;
正确用法:
typedef 一个完整的声明
在下面的这句代码中:
typedef int* pint;
我们将typedef去掉,变成:
int* pint;
声明了一个变量pint,类型是int*,在这句代码前面加上typedef后,pint不再是一个变量,而是一个别名,用来替代int*这个类型,
只是因为这句代码中声明部分过于简单,导致整句代码形式碰巧看起来像是:
typedef 原类型 别名
而这句代码:
typedef void (*fun)();
就很好的说明了typedef后面跟的是一个完整的声明而不是两部分,
我们将typedef去掉:
void (*fun)();
发现这句代码声明了一个变量fun,fun是一个指针,指向一个函数,这个函数的返回值是void,无参,在这句代码前面加上typedef,表示fun不再是一个变量,而是一个类型的别名,这个类型是一个返回值为void的无参的函数指针。