typedef 是用來定義一種型別的新別名的,它不同於宏(#define),不是簡單的字串替換。它的新名字具有一定的封裝性,所以新命名的識別符號具有更易定義變數的功能,它是語言編譯過程的一部分,但它並不實際分配記憶體空間。
而 #define 只是簡單的字串替換(原地擴充套件),它本身並不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了。因此,它不會做正確性檢查,不管含義是否正確它照樣會帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。
接下來看下面的範例程式碼:
typedef char * PCHAR1;
#define PCHAR2 char *……
/* c1、c2 都為char *,typedef為char *引入了一個新的別名*/
PCHAR1 c1, c2;
/*相當於char * c3, c4;c3是char *,而c4是char */
PCHAR2 c3, c4;
在定義上述的變數時,c1、c2 與 c3 按照預期都被定義成 char* 型別。值得注意的是,c4 卻被定義成 char 型別,而不是我們所預期的 char*。其根本原因就在於 #define 只是簡單的字串替換,而 typedef 則是為一個型別引入一個新的別名。