typedef
Typedef 的缺點
typedef 可能導致大型 C 程式中名稱空間的汙染。
Typedef 結構的缺點
此外,沒有標籤名稱的 typedef’d 結構是不必要的標頭檔案之間的排序關係的主要原因。
考慮:
#ifndef FOO_H
#define FOO_H 1
#define FOO_DEF (0xDEADBABE)
struct bar; /* forward declaration, defined in bar.h*/
struct foo {
struct bar *bar;
};
#endif
有了這樣的定義,不使用 typedefs,編譯單元可以包含 foo.h 來獲得 FOO_DEF 的定義。如果它不試圖取消引用 foo 結構的 bar 成員,則不需要包含 bar.h 檔案。
Typedef vs #define
#define 是一個 C 前處理器指令,它也用於定義類似於 typedef 的各種資料型別的別名,但有以下區別:
-
typedef僅限於為型別提供符號名稱,因為#define也可用於定義值的別名。 -
typedef解釋由編譯器執行,而#define語句由前處理器處理。 -
請注意,
#define cptr char *後跟cptr a, b;與typedef char *cptr;不同,後跟cptr a, b;。使用#define,b是一個普通的char變數,但它也是typedef的指標。