我看到这边请在C11中使用匿名struct实现某种struct继承,并想尝试一下。以下是我所拥有的:
struct struct_a {
int aa;
};
struct struct_b {
struct struct_a;
int bb;
};
int main(void)
{
volatile struct struct_b my_b;
my_b.aa = 5; /* not a member of my_b */
my_b.bb = 6;
}gcc的结果:
$ gcc -std=c11 struct_extend.c
struct_extend.c:11:20: warning: declaration does not declare anything
struct struct_a;
^
struct_extend.c: In function ‘main’:
struct_extend.c:18:9: error: ‘volatile struct struct_b’ has no member named ‘aa’
my_b.aa = 5; /* not a member of my_b */相关:
$ gcc --version
gcc (Debian 6.3.0-18) 6.3.0 20170516这不是在我的编译器中实现的,还是我做错了?
发布于 2017-10-17 07:41:15
根据GCC引用:使用-fms-extensions标志,这将启用此特性。
-fms-extensions,否则未命名字段必须是没有标记的结构或联合定义(例如,‘struct{ int a;};’‘)。如果使用-fms-extensions,则该字段还可以是带有标记(如‘struct foo { int a; };’ )的定义、对先前定义的结构或联合(如“struct;”)的引用,或者是对先前定义的结构或联合类型的类型名称的引用。-fplan9-extensions支持-fms-extensions以及其他两个扩展。首先,指向结构的指针自动转换为指向匿名字段的指针,以便进行赋值和函数调用。我用过GCC的命令,它运行得很好。
gcc -std=c11 -O2 -Wall -fms-extensions -pedantic -pthread ls.c发布于 2017-10-17 07:22:09
该标准只允许结构和联合,没有标记作为未命名的成员:
6.7.2.1结构和联盟说明-第13段
是一个未命名的成员,其类型说明符是没有标记的结构说明符,称为匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名成员。匿名结构或工会的成员被视为包含结构或工会的成员。如果包含的结构或联合也是匿名的,则这将递归地应用。
你的答案显然是有标签的,所以它是无效的。你链接到的答案也没有更好的答案。令人遗憾的是,以一种符合标准的方式这样做是相当冗长的:
struct struct_b {
union {
struct struct_a _aa;
struct { int aa; };
};
int bb;
};这真的不是什么值得你印象深刻的东西。我们也许可以使用宏来避免重复成员声明,但现在它已经是一种代码味了。
发布于 2017-10-17 07:32:15
您似乎试图在struct_b中创建包含struct_b的匿名未命名结构,类似于以下内容:
#include <stdio.h>
struct struct_b {
struct {
int aa;
};
int bb;
};
int main(void)
{
volatile struct struct_b my_b;
my_b.aa = 5; /* now a member of my_b */
my_b.bb = 6;
printf ("my_b.aa: %d\nmy_b.bb: %d\n", my_b.aa, my_b.bb);
return 0;
}示例使用/输出
$ ./bin/strc2
my_b.aa: 5
my_b.bb: 6这直接来自StoryTeller引用的标准部分。
https://stackoverflow.com/questions/46784479
复制相似问题