最近看Scintillia的源代碼,總看到typedef的身影,朋友也說(shuō)autodesk的面試官曾說(shuō)過(guò)不懂typedef很差勁。于是查了網(wǎng)上的資料,看了幾種比較
容易出錯(cuò)的常用用法,做了一些整理。
一.起別名的兩種用法
1. typedef (int *) pInt;

2. typedef pInt (int *)

比如pInt a,b;
第一種表示: int*a;int*b;
第二種表示: int*a,b;
所以第一種更像一個(gè)類(lèi)型,第二種更像宏。
二.舊式代碼中聲明對(duì)象
typedef struct tagPoint



{

Int x;

Int y;

}POINT;

POINT a,b;

三.代碼簡(jiǎn)化
為復(fù)雜的聲明定義一個(gè)新的簡(jiǎn)單的別名
方法:在原來(lái)的聲明里逐步用別名替換一部分復(fù)雜聲明,如此循環(huán),把帶變量名的部分留到最后替換,得到的就是原聲明的最簡(jiǎn)化版
typedef int (*PF) (const char *, const char *);
這個(gè)聲明引入了 PF 類(lèi)型作為函數(shù)指針的同義字,該函數(shù)有兩個(gè) const char * 類(lèi)型的參數(shù)以及一個(gè) int 類(lèi)型的返回值。
如果要使用下列形式的函數(shù)聲明,那么上述這個(gè) typedef 是不可或缺的:
PF Register(PF pf);
Register() 的參數(shù)是一個(gè) PF 類(lèi)型的回調(diào)函數(shù),返回某個(gè)函數(shù)的地址,其署名與先前注冊(cè)的名字相同。如果不用 typedef,那么代碼是這樣的:
int (*Register (int (*pf)(const char *, const char *)))(const char *, const char *);