[英]Why does the compilation pass with no warnings/errors?
#include <stdio.h>
union {
struct {
int a;
int c;
};
struct {
int b;
int a;
};
}unionTry;
int main(){
unionTry.a = 1;
unionTry.b = 2;
unionTry.c = 3;
printf("a = 0x%x b = 0x%x c = 0x%x\n", unionTry.a, unionTry.b, unionTry.c);
return 0;
}
拆卸:
400578: 55 push %rbp
400579: 48 89 e5 mov %rsp,%rbp
40057c: c7 05 56 04 20 00 01 movl $0x1,0x200456(%rip) # 6009dc <unionTry>
400583: 00 00 00
400586: c7 05 50 04 20 00 02 movl $0x2,0x200450(%rip) # 6009e0 <unionTry+0x4>
40058d: 00 00 00
400590: c7 05 46 04 20 00 03 movl $0x3,0x200446(%rip) # 6009e0 <unionTry+0x4>
400597: 00 00 00
40059a: 8b 0d 40 04 20 00 mov 0x200440(%rip),%ecx # 6009e0 <unionTry+0x4>
4005a0: 8b 15 3a 04 20 00 mov 0x20043a(%rip),%edx # 6009e0 <unionTry+0x4>
4005a6: 8b 35 30 04 20 00 mov 0x200430(%rip),%esi # 6009dc <unionTry>
4005ac: bf bc 06 40 00 mov $0x4006bc,%edi
4005b1: b8 00 00 00 00 mov $0x0,%eax
4005b6: e8 e5 fe ff ff callq 4004a0 <printf@plt>
4005bb: b8 00 00 00 00 mov $0x0,%eax
4005c0: c9 leaveq
4005c1: c3 retq
4005c2: 90 nop
輸出:
$gcc -Wall a.c && ./a.out
a = 0x2 b = 0x2 c = 0x3
顯然它缺乏C11標准支持。 以下代碼是否定義良好:
union {
struct {
int a;
int c;
};
struct {
int a;
int b;
};
}unionTry;
匿名結構和工會已在C11中標准化。 Gcc之前允許他們作為擴展。 對於這兩種型式中,結構或聯合聲明必須是明確的( a
在該代碼示例是不明確的,因此違反本規則)。 在C11中,必須在編譯時檢測此類違規,並且在使用GNU方言編譯時,新版本的Gcc也遵循此要求。
使用Gcc 4.1.2時,未檢測到它。 來自文檔 [emph。 礦]:
您絕不能創建導致模糊字段定義的結構。 例如,這個結構:
struct { int a; struct { int a; }; } foo;
用
foo.a
引用a
是不foo.a
。 不支持此類構造,必須避免使用。 將來,可以檢測這些結構並將其視為編譯錯誤 。
版本4.6.4更改了重點條目。
它不編譯。
使用MinGW,gcc 4.9.1和您的編譯器設置:
gcc -Wall test.c
test.c:9:13: error: duplicate member 'a'
int a;
^
使用適當的編譯設置:
gcc test.c -std=c11 -pedantic-errors -Wall -Wextra
test.c:9:13: error: duplicate member 'a'
int a;
^
更新您的gcc版本。 在C11中添加了匿名結構/聯合(但在此之前存在為gcc擴展名)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.