C11标准中添加了匿名结构,所以
typedef struct {
struct {int a, b};
int c;
} abc_struct;
是有效且标准的。使用typedef代替完整的struct声明是否也在标准范围内? E.g:
typedef struct {
int a, b;
} ab_struct;
typedef struct {
ab_struct;
int c;
} abc_struct;
海湾合作委员会的文件说,这是一个Plan 9扩展,但它可以在 我尝试过的编译器很少(包括GCC ......)。通过我阅读标准本身, 我认为没关系,但这是一种容易搞砸的近距离阅读。
答案 0 :(得分:10)
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中提出的问题请参阅http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf中的 5.28 SC22WG14.12205,匿名结构(N1425)
答案 1 :(得分: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;
}
如果没有abc.a = 5;
,您将在第13行-fplan9-extensio
上收到语法错误。
然后使用顶部代码段,您的匿名结构将按照您的想法运行。即:
typedef struct {
struct {
int a, b;
};
int c;
} abc_struct;
int main() {
abc_struct abc;
abc.a = 5;
return 0;
}
答案 2 :(得分:0)
好吧,我担心我还没有费心去完成标准,但这是最终草案的内容:
我只能解释为只有struct {};
和union {};
可以是匿名结构/联合。