以前以為 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 的作用範圍: 和變數宣告遵守相同的規則

arrow
arrow
    文章標籤
    C 語言 #define typedef
    全站熱搜

    MagicJackTing 發表在 痞客邦 留言(0) 人氣()