在 typede f和宏文本替換之間存在一個關鍵性的區別。正確思考這個問題的方法就是把typedef 看成是一種徹底“封裝”類型——在聲明它之後不能再往裏面增加別的東西。它和宏的區別體現在兩個方面。
區別一:
首先,可以用其它類型說明符對宏類型名進行擴展,但對 typedef 所定義的類型名卻不能這樣做。如下所示:
區別二:
其次, 在連續幾個變量的聲明中,用 typedef 定義的類型能夠保證聲明中所有的變量均爲同一種類型,而用#define定義的類型則無法保證。如下所示:
經過宏擴展,第二行變爲:
這使得 chalk 和 cheese 成爲不同的類型,就好像是辣椒醬和細香蔥的區別;chalk 是一個指向 int 的指針, 而cheese 則是一個 int。相反,下面的代碼中:
Bentley 和 Rolls_Royce的類型依然相同。雖然前面的類型名變了,但它們的類型相同,都是指向 char 的指針。