以前以為 typedef 的功能可以用 #define 來完成, 用起來感覺功能也差不多, 例如:
typedef unsigned char bool; // 用這一行或者是下一行 二選一
//#define bool unsigned char
bool flag1, flag2;
不過使用 #define 是不能直接把結構的定義和 typedef 寫在一起. 用 #define 時需要先定義一個結構並為它命名, 再用 #define 來置換它們, 如下:
typedef struct _list_node_ {
long size;
strcut _list_node_ *next;
} LIST_NODE;
LIST_NODE * free_list;
或
struct _list_node_ {
long size;
strcut _list_node_ *next;
}
#define LIST_NODE struct _list_node_
LIST_NODE * free_list;
但是再更進一步, 例如下面這二行程式
typedef int *INTPTR;
INTPTR a, b;
如果你把它改成用 #define
#define INTPTR int *
INTPTR a, b;
喔! 喔...糗了! 上一段的變數 b 是指標, 怎麼改用 #define 後變數 b 變成了 int
還有複雜一點的 typedef 是很難用 #define 來替換的 (不信的話參考這篇的例子, 自己用 #define 改寫看看), 所以記住不要硬幹
其他差異
#define
- #define 是給 preprocessor 看的
- prepprocessor 看完執行完 #define 及置換後, 會把這些 #define 的東西拿掉, 所以 C 編譯器是看不到這些 #define 的
- #define 的作用範圍是整個檔案 (從 #define 開始一直到 #undef或檔案結束)
typedef
- typedef 是給 C 編譯器看的.
- typedef 的作用範圍: 和變數宣告遵守相同的規則
文章標籤
全站熱搜