typedef 是 C 語言「類型別名」關鍵字,通俗說就是給類型起個「綽號」。本文通過兩個實戰場景——簡化複雜類型聲明、消除指針聲明歧義——演示 typedef 的即時價值,附代碼對比與編譯器報錯演示。
typedef struct Person {
int age;
char *name;
char flag;
} Person_t;
// 聲明變量:無需重複 struct 關鍵字
Person_t p1; // 簡潔
struct Person p2; // 也合法,但繁瑣
signal 原型標準庫 signal 原型極其晦澀:
void (*signal(int signo, void (*func)(int)))(int);
使用 typedef 分層定義:
// 第一層:定義「無參無返回函數」類型 typedef void SigHandler(int); // 第二層:signal 參數與返回類型均為 SigHandler* SigHandler *signal(int signo, SigHandler *func);
瞬間清晰:signal 接收信號編號和處理函數指針,返回前一個處理函數指針。
#includeint main() { int *p1, p2; // 意圖:兩個 int* 指針 int a = 3, b = 5; p1 = &a; p2 = &b; // 編譯錯誤:p2 是 int,不能賦值地址 printf("a = %d\n", *p1); printf("b = %d\n", *p2); // 運行時錯誤:p2 非指針 return 0; }
typFile.c:12:5: warning: assignment makes integer from pointer without a cast
p2 = &b;
typFile.c:15:21: error: invalid type argument of unary '*' (have 'int')
printf("b = %d \n", *p2);
#includetypedef int *pInt; // 定義「int 指針」類型別名 int main() { pInt p1, p2; // 現在 p1、p2 確定都是 int* int a = 3, b = 5; p1 = &a; p2 = &b; printf("a = %d\n", *p1); printf("b = %d\n", *p2); return 0; }
a = 3 b = 5
| 聲明方式 | 實際類型 | 原因 |
|---|---|---|
int *p1, p2; | p1: int*, p2: int | * 綁定標識符 p1,非類型 int |
typedef int *pInt; pInt p1, p2; | p1: int*, p2: int* | pInt 已完整包含指針屬性,聲明時整體應用 |