typedef 是 C 語言關鍵字,用於為現有類型創建別名。它不創建新類型,僅在編譯階段提供語法糖,增強代碼可讀性、可移植性與可維護性。
[cpp]
typedef int Size; // 語義:尺寸/長度
typedef unsigned char Byte; // 語義:字節
Size len = 10;
Byte buffer[1024];
[cpp]
// 固定長度字符串類型
typedef char Line[81];
Line text, input; // 等價於 char text[81], input[81];
// 指針別名
typedef char* PStr;
int strcmp(PStr, PStr); // 參數可讀性提升
// 結構體別名(C 模擬 OOP 常用)
typedef struct Node {
int data;
struct Node *next;
} Node, *PNode;
[cpp]
// 無 typedef:極難閱讀
int (*Register(int (*pf)(const char*, const char*)))(const char*, const char*);
// 有 typedef:清晰明瞭
typedef int (*Callback)(const char*, const char*);
Callback Register(Callback pf);
[cpp]
// 根據平台精度選擇最高精度浮點型
#if defined(__LDBL_MAX_EXP__) && __LDBL_MAX_EXP__ > 1024
typedef long double Real; // 支持 long double
#elif defined(__DBL_MAX_EXP__)
typedef double Real; // 僅支持 double
#else
typedef float Real; // 僅支持 float
#endif
// 標準庫典型例子
typedef unsigned long size_t;
typedef long ptrdiff_t;
typedef long fpos_t;
| 特性 | typedef | #define |
|---|---|---|
| 處理階段 | 編譯期(語法分析) | 預處理期(文本替換) |
| 作用域 | 遵循 C 作用域規則 | 無作用域,全局替換 |
| 指針聲明 | typedef int* IntPtr; IntPtr a, b; → a,b 皆為 int* | #define IntPtr int* IntPtr a, b; → a 是 int*,b 是 int |
| 組合類型 | 支持 | 極易出錯 |
| 調試符號 | 保留類型信息 | 無類型信息 |
[cpp]
typedef char *PStr;
const PStr p1; // 實際是 char *const p1(常量指針),而非 const char *(指向常量指針)
// 正確做法:在 typedef 中包含 const
typedef const char *CPStr;
CPStr p2; // 正確:const char *p2
[cpp]
typedef static int FastInt; // ❌ 編譯錯誤:storage class specified twice
// typedef 已佔用存儲類位置
[cpp]
// 正確:同時定義結構體標籤與 typedef 名
typedef struct Node {
int data;
struct Node *next; // 內部引用需用標籤名
} Node, *PNode;
// 也可分離
struct Node; // 前向聲明
typedef struct Node Node; // 別名
struct Node { ... }; // 完整定義
std::string → basic_string<char, char_traits<char>, allocator<char>>std::ofstream → basic_ofstream<char, char_traits<char>>size_t, ptrdiff_t, int32_t, uintptr_t 等 <stdint.h> 類型Int32, Real 等),配合條件編譯。typedef int* PInt 可能掩蓋指針語義,導致 const 誤用。_t 結尾(如 Callback_t)或大寫開頭(Node),區別於變量名。