typedef 為現有類型建立別名,不產生新類型。語法類似儲存類別(如 static、extern),不可與其並用。
| 特性 | typedef | #define |
|---|---|---|
| 作用對象 | 僅限類型 | 值、運算式、類型皆可 |
| 處理階段 | 編譯器 | 預處理器 |
| 靈活度 | 高(支援複雜類型) | 低(單純文字替換) |
typedef unsigned int BYTE; BYTE x, y[10], *z; // 一眼看出是位元組相關變數
// 系統 A: typedef unsigned long time_t; // 系統 B: typedef unsigned int time_t; // 移植時只需修改 typedef 定義 time_t time(time_t *);
// 結構體別名
typedef struct { double x; double y; } Point;
Point p1 = {3.0, 6.0};
// 函數指標別名
typedef int (*CompareFunc)(const char *, const char *);
CompareFunc cmp = strcmp;
從變數名出發,先右後左,遇括號反向:
int (*func)(int *p); // func 是函數指標,指向參數 int* 回傳 int 的函數 int (*func[5])(int *); // func 是 5 元素陣列,元素為函數指標
// 原始複雜宣告 void (*signal(int signr, void (*handler)(int)))(int); // 兩次 typedef 簡化 typedef void SigFunc(int); SigFunc *signal(int signr, SigFunc *handler);
善用 typedef 讓程式碼更清晰、可維護、可移植。