struct aa vs struct { ... } aa#include "stdio.h"
struct aa {
int a, b, c;
};
void main() {
aa.a = 2; // 錯誤:aa 是結構體標籤,非變數名
aa.b = 3;
aa.c = 4;
printf("%d %d %d", aa.a, aa.b, aa.c);
}
struct aa { ... }; 只是定義了一個**結構體標籤**(型別名稱),**未建立任何變數**。aa.a 試圖用標籤當變數存取成員,編譯器報錯「aa undeclared」或「request for member in something not a structure」。
#include
struct AA { // 標籤習慣大寫
int a, b, c;
};
int main(void) {
struct AA aa; // 變數名可用小寫 aa
aa.a = 2;
aa.b = 3;
aa.c = 4;
printf("%d %d %d\n", aa.a, aa.b, aa.c);
return 0;
}
#include
struct { // 無標籤
int a, b, c;
} aa; // 直接建立變數 aa
int main(void) {
aa.a = 2; aa.b = 3; aa.c = 4;
printf("%d %d %d\n", aa.a, aa.b, aa.c);
return 0;
}
typedef 別名(現代慣用)typedef struct {
int a, b, c;
} AA_t; // 以 _t 結尾表示型別
int main(void) {
AA_t aa = {2, 3, 4}; // C99 指定初始化器
printf("%d %d %d\n", aa.a, aa.b, aa.c);
return 0;
}
| 寫法 | 含義 | 可建立多少變數 |
|---|---|---|
struct Tag { ... }; | 定義標籤 Tag | 後續可用 struct Tag var; 建立任意多個 |
struct Tag { ... } var; | 定義標籤 Tag 並建立變數 var | 1 個(同一行) |
struct { ... } var; | 匿名結構體,建立變數 var | 1 個(無標籤無法複用) |
typedef struct { ... } Type; | 定義新型別 Type | 任意多個 Type var; |
void main() → int main(void)標準要求 main 返回 int,請養成 int main(void) { ... return 0; } 習慣。