typedef 原類型 新類型名; // 例 typedef int Integer; Integer a = 8; // 等價於 int a = 8;
typedef Integer MyInt;typedef uint32_t u32; 統一項目類型風格typedef char *String; String s = "hello"; // char *s String s1, s2; // char *s1, *s2 —— 注意:每個變量都是指針
陷阱對比:#define String char * 時,String s1, s2 展開為 char *s1, s2 → s2 是 char 而非指針!typedef 是類型系統一部分,宏只是文本替換。
/* 方式 1:先定義再別名 */
struct Person { char *name; int age; };
typedef struct Person Person_t;
Person_t p = {"Alice", 20};
/* 方式 2:定義時同時別名,結構體標籤可省略 */
typedef struct {
int age;
} Student;
Student stu = {18};
/* 方式 3:結構體指針別名(鏈表常用) */
typedef struct Node {
int data;
struct Node *next;
} Node, *NodePtr; // Node 是結構體類型,NodePtr 是指針類型
Node n1 = {1, NULL}, n2 = {2, NULL};
n1.next = &n2;
NodePtr p = &n2; // 等價於 struct Node *p
typedef enum { SPRING, SUMMER, AUTUMN, WINTER } Season;
Season s = SUMMER;
int add(int a, int b) { return a + b; }
/* 無 typedef:int (*p)(int, int) = add; */
typedef int (*BinaryOp)(int, int);
BinaryOp op = add;
int result = op(3, 5); // 8
回調函數、狀態機、插件架構中極大提升可讀性。
| 特性 | typedef | #define |
|---|---|---|
| 處理階段 | 編譯期(語義分析) | 預處理期(文本替換) |
| 作用域 | 遵循 C 作用域規則 | 無作用域,文件級生效 |
| 指針聲明 | 每個變量都是指針 | 僅首個變量是指針 |
| 組合類型 | 支持(函數指針、數組等) | 極易出錯 |
| 調試符號 | 保留類型信息 | 無類型信息 |
typedef int32_t i32; typedef uint32_t u32;typedef struct { ... } TypeName;typedef Type *TypePtr; 便於識別typedef 是 C 語言類型系統的擴展機制,比宏更安全、更語義化、更利於維護。掌握「基本類型、指針、結構體、函數指針」四大典型用法,並牢記「指針聲明陷阱」,能寫出更清晰、可移植的 C 代碼。