typedef 是 C/C++ 的儲存類關鍵字,用於為現有型別建立別名(同義詞)。它不創建新型別,只是讓程式碼更具可讀性、可移植性與可維護性。編譯器在編譯期處理 typedef,比巨集 #define 更安全、語義更清晰。
typedef int Size; // 語義化:Size 表達「大小」意圖
typedef long double Real; // 平台相關:x86 用 long double,嵌入式改 double
標準庫大量採用此模式:size_t、ptrdiff_t、int32_t 等皆為 typedef 產物。
typedef char Line[81]; // 固定長度字串型別
typedef char *PStr; // 字串指標型別
typedef int (*CmpFunc)(const char*, const char*); // 函式指標型別
使用時:Line buf; PStr s = "hello"; CmpFunc cmp = strcmp; — 程式碼瞬間清爽。
typedef std::basic_string<char, std::char_traits<char>, std::allocator<char>> String;
typedef std::basic_ofstream<char, std::char_traits<char>> OFileStream;
標準庫 std::string、std::ofstream 本質上就是這樣的 typedef。
typedef char *PStr;
const PStr p1; // 錯誤理解:以為是 const char*;實際是 char* const (常量指標)
正解:先定義指向常量的指標別名:
typedef const char *CPStr;
const CPStr p2; // 正確:const char* const
口訣:typedef 定義指標時,若需 const 修飾被指物件,必須把 const 放在別名定義內部。
typedef register int FastInt; // 編譯錯誤:typedef 已佔據儲存類位置
typedef、static、extern、register 同屬儲存類說明符,互斥。
// C 風格:標籤與別名分離
struct NodeTag { int val; struct NodeTag *next; };
typedef struct NodeTag Node;
// C++ 風格:直接用同名別名
struct Node { int val; Node *next; }; // 結構名即型別名
現代 C++ 傾向直接使用結構名,減少 typedef struct {} Type; 寫法。
typedef void (*Handler)(int); // 參數類型固定
// 後續無法直接改為 void (*)(long) — 需重新定義別名
若需泛型回調,C++11 起建議改用 std::function<void(int)>。
int32_t、Real)建立別名,集中維護。SocketFD、ErrorCode、ByteBuffer。typedef int MyInt; 累增認知負擔)。const/volatile 除非極度確定語義。typedef 是 C/C++ 型別系統的「語義層」,善用它能讓程式碼自文檔化、跨平台遷移只需改一行、複雜宣告一行搞定。記住四大陷阱,寫出更健壯、可維護的程式碼。