最近看Scintillia的源代码,总看到typedef的身影,朋友也说autodesk的面试官曾说过不懂typedef很差劲。于是查了网上的资料,看了几种比较
容易出错的常用用法,做了一些整理。
一.起别名的两种用法
1. typedef (int *) pInt;
2. typedef pInt (int *)
比如pInt a,b;
第一种表示: int*a;int*b;
第二种表示: int*a,b;
所以第一种更像一个类型,第二种更像宏。
二.旧式代码中声明对象
typedef struct tagPoint
{
Int x;
Int y;
}POINT;
POINT a,b;
三.代码简化
为复杂的声明定义一个新的简单的别名
方法:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版
typedef int (*PF) (const char *, const char *);
这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。
如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:
PF Register(PF pf);
Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。如果不用 typedef,那么代码是这样的:
int (*Register (int (*pf)(const char *, const char *)))(const char *, const char *);