很多初學者見 typedef double sjd; 以為是函數聲明。**錯!** typedef 是 C 語言的**存儲類別說明符**,作用在**編譯階段**,為現有類型起個**新名字(別名)**,**不創建新類型**。
// 基本類型別名
typedef unsigned long long u64;
typedef int32_t i32; // 標準整數類型別名 (需 )
// 指針別名 (極常用)
typedef char* pstr; // pstr 等價於 char*
typedef void (*callback_t)(int); // 函數指針別名,簡化聲明
// 結構體別名 (慣用模式)
typedef struct Node {
int data;
struct Node* next;
} Node, *PNode; // Node 為結構體類型,PNode 為指針類型
// 數組別名
typedef int IntArray10[10]; // IntArray10 代表 int[10]
| 特性 | typedef | #define |
|---|---|---|
| 處理階段 | 編譯器 (語義分析) | 預處理器 (文本替換) |
| 作用域 | 遵循 C 作用域規則 | 全局文本替換,無作用域 |
| 指針處理 | typedef char* pstr; pstr a, b; → a,b 皆為 char* | #define pstr char* pstr a, b; → a 是 char*,b 是 char (陷阱!) |
| 類型安全 | 編譯器檢查 | 無,純文本 |
| 調試器可見性 | 可見類型名 | 不可見,展開後為原類型 |
int32_t, uintptr_t 等 (<stdint.h>),跨平台移植無憂。_t 結尾 (POSIX 風格) 或大駝峰 NodePtr,與變量名區分。**記住:typedef 不分配內存,不產生代碼,只是給編譯器一個「這個名字代表那個類型」的提示。**