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 {};
可以是一个匿名结构/联合。