簡體   English   中英

為什么編譯沒有警告/錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM