typedef 是 C/C++ 中建立型別別名的核心機制,不僅能簡化複雜型別宣告,更能提升程式碼可讀性、可移植性與維護性。本文系統整理 typedef 四大核心應用場景:基本型別別名、結構體/類別別名、陣列型別別名、函式指標別名,並對比現代 using 語法優勢。
typedef existing_type new_name;
範例:typedef unsigned int UINT; → UINT a, b; 等同 unsigned int a, b;
傳統寫法:
struct { int x; int y; } point_a, point_b;
struct { struct { int x; int y; } part1; int part2; } cplx;
重複撰寫結構體定義,易錯且難維護。
typedef 簡化:
typedef struct { int x; int y; } Point;
Point var_1;
Point array_1[10];
struct { Point part1; int part2; } cplx;
自參考結構(鏈結串列節點):
typedef struct t_node {
int value;
struct t_node *next; // 或 Node *next;
} Node;
typedef int MyIntArray[100];
MyIntArray ia; // 等同 int ia[100];
便於統一修改陣列大小、作為函式參數型別。
typedef void (*FUNCADDR)(int); // 指向 void func(int) 的指標
void print(int x) { printf("%d\n", x); }
int main() {
FUNCADDR pFunc = print;
pFunc(25); // 或 (*pFunc)(25);
return 0;
}
應用場景:回呼函式、中斷處理器、事件處理器、策略模式、外掛架構。
typedef class {
private: int a;
public: int b;
} MyClass;
語法合法但罕用,現代 C++ 偏好直接 class MyClass { ... };。
C++11 引入 using,語法更清晰、支援樣板別名:
| 場景 | typedef | using (C++11) |
|---|---|---|
| 基本型別 | typedef int MyInt; | using MyInt = int; |
| 函式指標 | typedef void (*FP)(int); | using FP = void(*)(int); |
| 樣板別名 | 不支援 | template<typename T> using Vec = std::vector<T>; |
| 陣列 | typedef int Arr[10]; | using Arr = int[10]; |
建議:新專案優先使用 using,舊代碼維護沿用 typedef。
typedef:編譯器層級型別別名,參與型別檢查、作用域規則、除錯符號表#define:預處理器文字替換,無型別語意,易產生邊界錯誤(如 #define PTR int* → PTR a, b 展開為 int* a, b,b 非指標)typedef 是管理複雜型別系統的利器。掌握結構體、陣列、函式指標別名技巧,能大幅簡化宣告、統一型別命名、降低維護成本。現代 C++ 專案建議全面遷移至 using,享受樣板別名與更清晰語法帶來的工程效益。