巨集的一個通常的用途是保證不同地方的多個事物具有相同的類型:
#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的行為好像真正的類型一樣。
沒有留言:
張貼留言