typedef 為現有類型創建別名,不產生新類型。編譯階段處理,而非預處理器文本替換(區別於 #define)。
char *p1, p2; // p1 是指針,p2 是 char —— 易誤以為都是指針
typedef char* PChar;
PChar p3, p4; // p3、p4 都是 char* —— 清晰無歧義
// 傳統寫法
struct Point { int x, y; };
struct Point p1;
// typedef 寫法
typedef struct { int x, y; } Point;
Point p2; // 無需 struct 關鍵字
// 兼容兩種風格
typedef struct Node { int val; struct Node *next; } Node;
Node n1; // 推薦
struct Node n2; // 也合法
// types.h
#ifdef __LP64__
typedef long int64_t;
typedef int int32_t;
#else
typedef long long int64_t;
typedef int int32_t;
#endif
typedef float real32_t;
typedef double real64_t;
// 業務代碼只用 int32_t/real64_t,移植只改 types.h
標準庫 <stdint.h> 已提供 int32_t、uintptr_t 等,優先使用。
// 無 typedef
void (*signal(int, void(*)(int)))(int);
// 有 typedef
typedef void (*SigHandler)(int);
SigHandler signal(int, SigHandler); // 清晰得多
| 特性 | typedef | #define |
|---|---|---|
| 處理階段 | 編譯器語義分析 | 預處理器文本替換 |
| 作用域 | 遵循 C 作用域規則 | 全局文本替換 |
| 指針聲明 | 正確語義 | 文本展開易錯 |
| 調試器可見性 | 可見類型名 | 不可見 |
| 組合類型 | 支援 | 極難正確 |
PascalCase(Node, TreeNode)。lowercase_with_suffix_t(int32_t, real64_t)。VerbNounHandler / VerbNounCallback。_t 後綴用於非標準類型(POSIX 保留)。typedef struct Node *NodePtr; 隱藏指針屬性 → 參數傳遞時易忘解引用。建議不隱藏指針:typedef struct Node Node; Node *p;#ifndef 防重入。typedef 能創建強類型區分(如 typedef int UserId; typedef int OrderId; 仍可隱式轉換)。需用結構體包裝實現強類型。