typedef 不只是巨集替換,而是**型別別名機制**,參與型別系統,比巨集更安全、語義更清晰。本文詳解四大用法與「右左法則」讀寫複雜宣告。
char* pa, pb; // 陷阱:pa 為 char*,pb 為 char
// 改用 typedef:
typedef char* PCHAR;
PCHAR pa, pb; // 正確:兩者皆為 char*
// 雖 char *pa, *pb 也可,但 typedef 更直觀,大量指標處更省事
舊 C 需 struct Tag 名:
struct tagPOINT1 { int x; int y; };
struct tagPOINT1 p1; // 必須帶 struct
C++ 可直接 tagPOINT1 p1。為省去 struct 關鍵字,舊碼常見:
typedef struct tagPOINT { int x; int y; } POINT;
POINT p1; // 等同 tagPOINT p1,少寫 struct
現代 C++ 直接用 struct POINT { ... }; 即可,但理解此模式利於維護遺留代碼。
// 平台一:支援 long double
typedef long double REAL;
// 平台二:不支援 long double
typedef double REAL;
// 平台三:僅支援 float
typedef float REAL;
跨平台時**只改 typedef 定義**,業務代碼零修改。標準庫廣泛採用(如 size_t、ptrdiff_t、int32_t)。
方法:**逐步替換**,變數名部分最後替換。
int *(*a[5])(int, char*)a → 別名 pFuntypedef int (*pFun)(int, char*);pFun a[5];void (*b[10])(void (*)())pFunParam:typedef void (*pFunParam)();b → 別名二 pFunx:typedef void (*pFunx)(pFunParam);pFunx b[10];double (*(*e)[9])()pFuny:typedef double (*pFuny)();e → 別名二 pFunParamy:typedef pFuny (*pFunParamy)[9];pFunParamy e;[]/() 說明陣列/函數。*/& 說明指標/引用。示例:
// int (*func)(int *p)
func → 右 ) → 反向左 * → 指標
跳出 → 右 (int *p) → 函數,參數 int*
左 int → 回傳 int
結論:func 為指向「參數 int*、回傳 int 函數」的指標
// int (*func[5])(int *)
func → 右 [5] → 5 元素陣列
左 * → 元素為指標
跳出 → 右 (int *) → 指向「參數 int*、回傳 int 函數」的指標
結論:func 為函數指標陣列
掌握 typedef 四大用法與右左法則,輕鬆駕馭 C++ 型別系統,寫出清晰、可移植、可維護的代碼。