typedef 是編譯階段的類型別名機制,具有語義封裝性;#define 是預處理階段的文本替換,無類型語義。
| 維度 | typedef | #define |
|---|---|---|
| 處理階段 | 編譯期 (語法分析/語義分析) | 預處理期 (文本替換) |
| 語義理解 | 編譯器理解為類型 | 預處理器不理解類型 |
| 作用域 | 遵循 C 作用域規則 | 全局文本替換,無作用域 |
| 調試可見性 | 符號表保留類型資訊 | 替換後無痕跡 |
| 錯誤診斷 | 類型錯誤有意義提示 | 替換後可能產生離譜錯誤 |
// typedef 版本
typedef int *pINT;
pINT a, b; // 等價於 int *a, *b; 兩個整型指針
// #define 版本
#define pINT2 int *
pINT2 a, b; // 等價於 int *a, b; 一個指針 + 一個整型變量!
原因:typedef 建立完整類型實體,聲明時每個標識符都獲得該類型;#define 只是文本展開,int * a, b 中 * 僅綁定 a。
typedef char *PSTR;
const PSTR p; // 等價於 char * const p (常量指針:指針本身不可修改)
// 而非 const char *p (指向常量的指針:指向內容不可修改)
規則:const 修飾的是 typedef 定義的整個類型實體,而非展開後的文本。
// 函數指針類型
typedef int (*PFUNC)(int, char*); // 返回 int,參數 (int, char*)
PFUNC func_array[10]; // 清晰聲明 10 元函數指針陣列
// 對比直接聲明
int (*func_array[10])(int, char*); // 晦澀難讀
// 傳統 C 需攜帶 struct 關鍵字
struct Point { int x, y; };
struct Point p1; // C 必須
// typedef 合併定義
typedef struct {
int x, y;
} Point;
Point p1; // 簡潔,C++ 風格
// 平台 A:64 位長整數
typedef long int64_t;
// 平台 B:32 位長整數 + 長長整數
typedef long long int64_t;
// 極簡平台:無 64 位類型
typedef struct { int hi, lo; } int64_t;
// 業務代碼完全不用修改
int64_t big_number;
// 原聲明:void (*b[10]) (void (*)());
// 步驟 1:替換右側參數
typedef void (*pFunParam)();
// 步驟 2:替換左側變量
typedef void (*pFunx)(pFunParam);
// 最終:pFunx b[10];
typedef static int INT2; // ❌ 編譯錯誤:多重存儲類指定符
// 同理:typedef extern、typedef register、typedef auto 皆非法
typedef int ARRAY[10];
void func(ARRAY a); // 實際參數類型為 int *a,大小資訊丟失
// sizeof(a) 在函數內為指針大小,非 40
| 場景 | 推薦 | 理由 |
|---|---|---|
| 常量定義 | #define / const / enum | 語義明確,編譯器優化 |
| 類型別名 | typedef | 語義封裝、作用域控制、調試友好 |
| 簡單宏函數 | inline 函數 / constexpr | 類型安全、可調試、無副作用 |
| 複雜代碼塊 | do {...} while(0) 宏 / 內聯函數 | 避免控制流破壞 |
| 平台抽象 | typedef + 條件編譯 | 類型系統支援、跨平台一致性 |
// C++11 別名模板 (typedef 無法處理模板)
template
using Vec = std::vector;
Vec v; // 等價 std::vector
// 固定寬度整數 (標準庫)
#include
int32_t i32; // 替代自定義 typedef
uint64_t u64;
// 類型推導
auto p = std::make_unique(); // 替代繁瑣 typedef
const / enum / constexpr (C++)typedef (C) / using (C++11)inline 函數 / 模板#define 配合 #ifdeftypedef 分層拆解「typedef 讓類型系統為你工作;#define 讓文本編輯器為你工作——前者更安全、更智能。」