typedef 不僅能建立型別別名,更是提升程式碼可讀性、隱藏平台差異、簡化複雜宣告的利器。本文系統梳理 typedef 核心用法與常見陷阱,助你寫出更健壯、可維護的 C++ 程式碼。
定義機器無關的抽象型別,僅需修改 typedef 即可適配不同平台:
// 目標平台支援 long double
typedef long double REAL;
// 不支援 long double 的平台
typedef double REAL;
// 僅支援 float 的平台
typedef float REAL;
搭配條件編譯可自動化切換。標準庫廣泛採用此技巧:size_t、ptrdiff_t、fpos_t 皆為平台無關型別。
// 替代重複的 char line[81];
typedef char Line[81];
Line text, secondline;
// 隱藏指標語法
typedef char* pstr;
int mystrcmp(pstr, pstr);
// 函式指標:兩個 const char* 參數,回傳 int
typedef int (*PF)(const char*, const char*);
// 使用 PF 極度簡化回呼函式宣告
PF Register(PF pf);
// 不用 typedef 的噩夢版本
int (*Register(int (*pf)(const char*, const char*)))(const char*, const char*);
標準庫 signal() 函式即採用此模式,typedef 此處非特權而是必需。
錯誤示範:
typedef char* pstr;
int mystrcmp(const pstr, const pstr); // 錯誤!展開為 char* const(常數指標),非 const char*(指向常數的指標)
正確做法: 在 typedef 定義時直接包含 const:
typedef const char* cpstr;
int mystrcmp(cpstr, cpstr); // 正確
鐵律: 為指標定義 typedef 時,最終名稱務必包含 const,確保指標本身為常數。
typedef 與 auto、extern、static、register 同屬儲存類別指定符,同一宣告不可出現多個:
typedef register int FAST_COUNTER; // 編譯錯誤
標準庫容器類別名稱冗長難讀,typedef 可大幅簡化:
// std::basic_string<char, char_traits<char>, allocator<char>>
typedef std::string;
// std::basic_ofstream<char, char_traits<char>>
typedef std::ofstream;
typedef 不創造新型別,僅提供同義詞,編譯期處理,比巨集安全。const 與指標結合的優先順序陷阱,以及儲存類別指定符的互斥限制。typedef,閱讀其原始碼是最佳學習範本。熟練掌握 typedef,是邁向專業 C++ 開發者的關鍵技能之一。