2012-02-04 75 views
14

匿名結構已經在C11標準增加了,所以通過typedefs C11匿名結構?

typedef struct { 
    struct {int a, b}; 
    int c; 
} abc_struct; 

是啥標準。使用typedef代替完整的struct聲明是否也符合標準?例如: -

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 

GCC的文檔說,這是一個計劃9延伸,但隨後在 幾個編譯器我試過(包括GCC ...)的作品。通過閱讀標準本身,我認爲它是可以的,但這是一種很容易搞砸的密切閱讀。

回答

9

這個問題明顯在gcc團隊的Joseph S. Myers的問題中向C委員會提出。答案是否定的,在C11中是無效的。

在這裏看到了答案:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

而邁爾斯的評論:

本週的倫敦WG14會議上同意禁止使用的typedef的聲明匿名結構和聯合的字段,按N1549。

http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

有人問在SC22WG15.12205看到5.28 SC22WG14.12205,匿名結構(N1425)http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

0

好了,我怕我沒有打擾到拿到成品標準還沒有,但這裏是說,最終草案:

  • 一位不願具名的成員,其類型說明符是一個沒有標籤的結構說明符稱爲匿名結構;類型說明符是不帶標籤的聯合說明符的未命名成員稱爲匿名聯合。

我只能解釋爲,只有struct {};union {};可以是匿名的結構/聯合。

4

其實你的第二個片段是充滿了危險和不相當於第一個沒有在gcc中明確指定-fplan9-extensions

特別是ab_struct;第6行的聲明沒有任何內容(按照gcc警告)。只需粘貼你的第二個片段的foo.c中產生:

foo.c:6: warning: declaration does not declare anything 

,特別是如果你嘗試:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
} 

,你會在第13行abc.a = 5;出現語法錯誤沒有-fplan9-extensio

而使用頂部的片段,您的匿名結構將按照您應該的方式工作。即:

typedef struct { 
    struct { 
      int a, b; 
    }; 
     int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
}