C11匿名结构通过typedef?

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文档说这是Plan 9扩展,但它在我尝试过的少数编译器中工作(包括GCC ……)。 通过我对标准本身的阅读,我认为没关系,但这是一种容易搞砸的近距离阅读。

这显然是由gcc团队的Joseph S. Myers向C委员会提出的一个问题。 答案是否定的,它在C11中无效。

看到答案:

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

而迈尔斯的评论:

根据N1549,本周的伦敦WG14会议同意不允许使用typedef来声明匿名结构和联合字段。

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

在SC22WG15.12205中提出了这个问题,参见5.28 SC22WG14.12205,匿名结构(N1425) , url是http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

实际上你的第二个片段充满了危险,如果没有在gcc中明确指定-fplan9-extensions ,则不等同于第一个-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; } 

好吧,我担心我还没有费心去完成标准,但这是最终草案的内容:

  • 类型说明符是没有标记的结构说明符的未命名成员称为匿名结构; 一个未命名的成员,其类型说明符是一个没有标记的联合说明符,称为匿名联合。

我只能解释为只有struct {};union {}; 可以是一个匿名结构/联合。