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