typedef 建立型別別名// 寫法 A:帶標籤 + typedef
typedef struct Student {
int a;
} Stu; // Stu 成為 struct Student 別名
// 使用:Stu stu1; 或 struct Student stu1;
// 寫法 B:匿名結構 + typedef (無標籤)
typedef struct {
int a;
} Stu;
// 使用:只能用 Stu stu1; 無法用 struct Student
C 語言中 struct Student 屬於「結構標籤空間」,Stu 屬於「普通識別符空間」,兩者不通用,故需 typedef 彌合。
struct Student { int a; };
// 直接使用:Student stu2; (等同 struct Student stu2;)
// C++ 編譯器隱式完成:typedef struct Student Student;
C++ 為相容 C,保留 struct Student 寫法,但標籤名 Student 直接可作型別名使用。
typedef struct 的微妙陷阱struct Student { int a; } stu1; // stu1 是「變數實例」
typedef struct Student2 { int a; } stu2; // stu2 是「型別別名」 = struct Student2
// 使用差異:
stu1.a = 10; // 直接存取成員
stu2 s2; s2.a = 10; // stu2 是型別,必須先宣告實例
結論:C++ 中若寫 typedef struct Tag { ... } Name;,Name 是型別;若漏寫 typedef,Name 變成變數實例。極易混淆。
typedef struct { int num, age; } aaa, bbb, ccc;
// 等價於:
// typedef struct { ... } aaa;
// typedef aaa bbb;
// typedef aaa ccc;
// aaa/bbb/ccc 皆為同一結構型別的別名。
C++ 若去掉 typedef,aaa、bbb、ccc 變成三個獨立的變數實例。
typedef struct tagMyStruct {
int iNum;
long lLength;
} MyStruct;
tagMyStruct:標籤,配合 struct 關鍵字構成型別 struct tagMyStruct。MyStruct:型別別名,由 typedef 建立,等價於 struct tagMyStruct。宣告變數三種合法寫法 (C++):
struct tagMyStruct var;MyStruct var;tagMyStruct var; (C++ 隱式 typedef)C 僅支援前兩種。
typedef struct TagName { ... } TypeName; 形式,C/C++ 皆可用 TypeName 宣告。struct TypeName { ... };,享受語法簡潔,避免 typedef 陷阱。_t 結尾或 Tag 前綴 (如 Student_t、TagStudent),型別名用 PascalCase (如 Student),一目了然。struct 與 typedef struct 的差異本質上源於 C/C++ 對「標籤空間」與「識別符空間」處理機制的不同。掌握「標籤 ≠ 型別名」在 C 中的分離、C++ 的隱式合併、以及 typedef 變數/型別雙重語義的陷阱,是寫出可移植、無驚喜代碼的關鍵。