#define SIGN1 char*
typedef char* SIGN2;
int main() {
SIGN1 ch1, ch2; // 展開為 char* ch1, ch2;
SIGN2 ch3, ch4; // 等價於 char* ch3, ch4;
cout << sizeof(ch1) << " " << sizeof(ch2) << endl; // 4 1
cout << sizeof(ch3) << " " << sizeof(ch4) << endl; // 4 4
}
| 特性 | #define | typedef |
|---|---|---|
| 處理階段 | 預處理(文本替換) | 編譯(類型系統) |
| 語義 | 宏替換,無類型檢查 | 類型別名,參與類型推導 |
| 指針聲明 | #define P int* → P a,b 僅 a 是指針 | typedef int* P → P a,b 皆為指針 |
| 作用域 | 全局(文件級),無作用域限制 | 遵循 C++ 作用域規則 |
| 調試 | 調試器見不到宏名 | 調試器可識別類型別名 |
| 複雜類型 | 難以定義函數指針、模板別名 | 完美支援 using/typedef |
typedef 或 C++11 using(如 using P = int*;)。const/constexpr 替代 #define。#ifdef 等僅預處理器能做,仍需宏。#define 是盲目文本替換,typedef 是編譯器層面的類型別名。指針聲明時兩者行為截然不同:#define P int* 導致 P a,b 中 b 是 int;而 typedef int* P 使 a,b 均為 int*。現代 C++ 應盡量用 using/typedef/constexpr 替代宏。