我想知道是否可以在ANSI C中声明匿名结构。我的代码是:
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
当我编译它时,我得到: 警告:声明未声明任何内容
我已经读过标志-fms-extensions
可以解决这个问题,但它只适用于Windows系统,因为它产生:
警告:匿名结构是Microsoft扩展[-Wrosrosoft]
我可以使用任何ANSI等效扩展吗?
答案 0 :(得分:2)
在ANSI C中获得几乎此功能的一个技巧是使用适当的宏:
struct A {
int x;
};
struct B {
struct A A_;
int y;
};
#define bx A_.x
然后你可以简单地做
struct B foo, *bar;
foo.bx;
bar->bx;
但是在C11中,支持匿名结构,您只需执行
即可struct B {
struct {
int x;
};
int y;
}
但遗憾的是
struct A {
int x;
};
struct B
{
struct A;
int y;
};
由于匿名结构必须在结构中声明,因此它是匿名的。
有关C11中匿名成员的详细信息,请参阅this answer。
答案 1 :(得分:2)
可以声明匿名结构和联合。 ISO C11添加了此功能,GCC允许它作为extension。
C11部分§6.7.2.1第13段:
一个未命名的成员,其类型说明符是一个没有标记的结构说明符,称为匿名结构;一个未命名的成员,其类型说明符是一个没有标记的联合说明符,称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含的结构或联合也是匿名的,则递归应用。
19以下说明了匿名结构和联合:
struct v {
union { // anonymous union
struct { int i, j; }; // anonymous structure
struct { long k, l; } w;
};
int m;
} v1;
v1.i = 2; // valid
v1.k = 3; // invalid: inner structure is not anonymous
v1.w.k = 5; // valid
现在只需使用b
即可访问foo.b
。
答案 2 :(得分:0)
你想要这样的事情我想:
struct B {
struct {
int x;
} A;
int y;
};
你可以这样做:
struct B b;
b.A.x = 5;
printf( "%d\n", b.A.x );