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