| 特性 | typedef | #define |
|---|---|---|
| 處理階段 | 編譯期 (語義分析) | 預處理期 (文字替換) |
| 語意理解 | 建立新型別名稱 | 單純字串取代 |
| 作用域 | 遵循 C/C++ 作用域規則 | 無作用域,檔案範圍生效 |
| 指標宣告 | 正確處理多變數宣告 | 易產生指標/非指標混淆 |
const 修飾 | 修飾整個型別 | 僅修飾展開後的部分 |
| 除錯支援 | 除錯器可識別型別名稱 | 除錯器只見展開後型別 |
#define PINT int *
typedef int * pint;
const PINT p1; // 展開 → const int *p1 (指向常數的指標,p1 可改)
const pint p2; // 等價 → int * const p2 (常數指標,p2 不可改)
typedef 引入的名稱具備封裝性,const pint 鎖定的是指標本身;#define 只是文字替換,const PINT 變成 const int* 鎖定的是指向的資料。
#define PTR int *
typedef int * tPTR;
PTR a, b; // 展開 → int *a, b; (a 是指標,b 是 int)
tPTR a, b; // 正確 → int *a, *b; (兩者皆為指標)
typedef 在編譯期檢查型別正確性;#define 錯誤延遲到展開後編譯才發現typedef void (*Handler)(int); 清楚易讀;#define 極難正確定義typedef 可用於模板參數;#define 不可typedef 需分號結尾;#define 不可加分號 (會連同分號一起替換)using (C++11):using Handler = void(*)(int); — 語法統一、支援模板別名constexpr / const:型別安全、有作用域、除錯可見#ifdef)#pragma 包裝)#, ##)typedef 是型別系統一員,有語意、有作用域、可除錯;#define 是文字編輯器,無語意、無作用域、除錯盲區。能用 typedef/using/constexpr 就別用宏。