typedef 是 C 語言類型系統的擴展機制:為現有類型創建同義詞,**不創建新類型**。用得好,能隱藏平台差異、簡化複雜聲明、編碼設計意圖、構建可移植抽象層;用不好,成「宏替換」陷阱、const 傳播錯誤、存儲類衝突的溫床。本文系統梳理 typedef 核心用法、四大陷阱、工程級最佳實踐。
typedef 現有類型 新類型名;
// 例子
typedef int size_t; // 標準庫實際定義
typedef char Line[81]; // 數組類型別名
typedef char *pstr; // 指針類型別名
typedef int (*PF)(const char*, const char*); // 函數指針類型別名
typedef 出現在聲明開頭,屬**存儲類說明符** (與 static/extern 互斥)。typedef int SocketHandle; // 比 int 語義清晰
typedef uint32_t PacketID; // 固定寬度意圖明確
typedef float Temperature; // 業務語義
void setTemp(Temperature t); // 參數自帶文檔
// 無 typedef:令人絕望的 signal 原型
void (*signal(int sig, void (*func)(int)))(int);
// 有 typedef:清晰可讀
typedef void (*SigHandler)(int);
SigHandler signal(int sig, SigHandler func);
// 回調注冊函數
typedef int (*Callback)(void *ctx, int event);
Callback Register(Callback cb);
// x86_64 高精度
#if defined(__x86_64__)
typedef long double REAL;
// ARM64 雙精度足夠
#elif defined(__aarch64__)
typedef double REAL;
// 微控制器 單精度
#else
typedef float REAL;
#endif
REAL calculate(REAL x, REAL y); // 業務代碼零修改跨平台
標準庫 size_t, ptrdiff_t, intptr_t, uint32_t 皆此道。
// C++ 典型用法
typedef std::basic_string, std::allocator> String;
typedef std::vector> IntVec;
typedef char *pstr;
const pstr s1; // 錯誤理解:const char* 實際:char *const (指針常量,指向內容可改)
// 正解:先定義「指向常量的指針」類型
typedef const char *cpstr;
cpstr s2; // 正確:const char*
鐵律:指針 typedef 時,**同步定義帶 const 版本**,命名慣例 c+原名 (如 pstr → cpstr)。
typedef register int FAST_INT; // 編譯錯誤!typedef 已佔用存儲類位置
// 正解:直接用 register int 或現代編譯器自動優化,勿 typedef
typedef int *IntPtr;
IntPtr a, b; // a,b 都是 int*
#define IntPtrMacro int *
IntPtrMacro a, b; // a 是 int*, b 是 int (宏只是文本替換)!
// 風格 A:分離 (Linux 內核風格)
struct Node { int val; struct Node *next; };
// 使用:struct Node *head;
// 風格 B:合一 (Windows/嵌入式常見)
typedef struct Node { int val; struct Node *next; } Node_t;
// 使用:Node_t *head;
// 風格 C:匿名結構體 + typedef (C11 推薦)
typedef struct { int val; struct Node *next; } Node_t;
**建議**:項目統一風格,頭文件前置聲明用標籤,API 類型用 typedef 名。
stdint.h:uint32_t 而非 typedef unsigned int UINT32 (除非兼容舊代碼)。pstr / cpstr、Buffer / ConstBuffer。_t 後綴 (POSIX)、_Handle/ _ID / _Ctx 語義後綴、避免 _t 與系統類型衝突。typedef 是 C 語言類型系統的「介面定義語言」。善用它,能將「機器類型」提升為「業務類型」,將「複雜聲明」封裝為「可讀名字」,將「平台差異」隔離在編譯開關後。掌握 const 傳播、存儲類衝突、宏差異四大陷阱,讓 typedef 成為構建健壯、可移植、可維護代碼庫的利器。