最近看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 *);