使用 ANSI C 的匿名结构
Anonymous struct with ANSI C
我想知道是否可以在 ANSI C 中声明匿名结构。我的代码是:
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
当我编译它时,我得到:
警告:声明没有声明任何东西
我读到标志 -fms-extensions
可以解决问题,但是它只适用于 windows 系统,因为它会产生:
警告:匿名结构是 Microsoft 的扩展 [-Wmicrosoft]
是否有任何我可以使用的等效 ANSI 扩展?
在 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。
我想你想要这样的东西:
struct B {
struct {
int x;
} A;
int y;
};
你可以这样做:
struct B b;
b.A.x = 5;
printf( "%d\n", b.A.x );
可以声明匿名结构和联合。 ISO C11 添加了此功能,GCC 允许它作为 extension。
C11 节 §6.7.2.1 第 13 段:
An unnamed member whose type specifier is a structure specifier with no tag is called an anonymous structure; an unnamed member whose type specifier is a union specifier with no tag is called an anonymous union. The members of an anonymous structure or union are considered to be members of the containing structure or union. This applies recursively if the containing structure or union is also anonymous.
19 The following illustrates anonymous structures and unions:
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
现在只需使用 foo.b
.
即可访问 b
我想知道是否可以在 ANSI C 中声明匿名结构。我的代码是:
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
当我编译它时,我得到: 警告:声明没有声明任何东西
我读到标志 -fms-extensions
可以解决问题,但是它只适用于 windows 系统,因为它会产生:
警告:匿名结构是 Microsoft 的扩展 [-Wmicrosoft]
是否有任何我可以使用的等效 ANSI 扩展?
在 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。
我想你想要这样的东西:
struct B {
struct {
int x;
} A;
int y;
};
你可以这样做:
struct B b;
b.A.x = 5;
printf( "%d\n", b.A.x );
可以声明匿名结构和联合。 ISO C11 添加了此功能,GCC 允许它作为 extension。
C11 节 §6.7.2.1 第 13 段:
An unnamed member whose type specifier is a structure specifier with no tag is called an anonymous structure; an unnamed member whose type specifier is a union specifier with no tag is called an anonymous union. The members of an anonymous structure or union are considered to be members of the containing structure or union. This applies recursively if the containing structure or union is also anonymous.
19 The following illustrates anonymous structures and unions:
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
现在只需使用 foo.b
.
b