新聞速報

        

2014年2月27日 星期四

#define 與 typedef 的差異

巨集的一個通常的用途是保證不同地方的多個事物具有相同的類型:
#define FOOTYPE struct foo
FOOTYPE a;
FOOTYPE b, c;
這允許程式設計師可以通過只改變程序中的一行就能改變a、b和c的類型,儘管a、b和c可能宣告在很遠的不同地方。
使用這樣的巨集定義還有著可移植性的優勢——所有的C編譯器都支持它。
   
很多C編譯器並不支持另一種方法:
typedef struct foo FOOTYPE;
這將FOOTYPE定義為一個與struct foo等價的新類型。
 
這兩種為類型命名的方法可以是等價的,但typedef更靈活一些
 
例如:
#define T1 struct foo *
typedef struct foo * T2;
 
這兩個定義使得T1和T2都等價於一個struct foo的指標 pointer。
但看看當我們試圖在一行中宣告多於一個變數的時候會發生什麼:
T1 a, x;
T2 c, y;
 
第一個宣告被擴展為:
struct foo * a, x;
這裡 a 被定義為一個結構指標 pointer,但 x 被定義為一個結構(而不是指標 pointer)。
 
相反,第二個宣告中 c 和 y 都被定義為指向結構的指標 pointer,因為T2的行為好像真正的類型一樣。

沒有留言:

張貼留言