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
的指標。