我想知道是否有可能在ANSI C.声明匿名结构我的代码是:匿名结构与ANSI C
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
当我编译它,我得到: 警告:不申报不申报任何
我已阅读该标志-fms-extensions
的伎俩,但它仅适用于Windows系统,因为它产生: 警告:匿名结构是微软扩展[-Wmicrosoft]
是否有我可以使用的任何ANSI等效扩展?
我想知道是否有可能在ANSI C.声明匿名结构我的代码是:匿名结构与ANSI C
struct A
{
int x;
};
struct B
{
struct A;
int y;
};
当我编译它,我得到: 警告:不申报不申报任何
我已阅读该标志-fms-extensions
的伎俩,但它仅适用于Windows系统,因为它产生: 警告:匿名结构是微软扩展[-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;
}
可惜不是
由于匿名结构必须在结构内声明,所以它是匿名的。
请参阅this answer了解有关C11中匿名成员的更多详细信息。
它可以声明匿名结构和联合。 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
进行访问。
没有标识符的'struct'?不,我不这么认为。您可以声明一个没有类型名称的'struct',但是带有'struct {}标识符的标识符''。'struct's'成员具有明确的范围,那么如何在没有标识符的情况下处理成员呢? – Downvoter
ANSI C没有此功能。你仅限于ANSI C还是可以使用C99或C11? – fuz
我可以使用C99和C11,有没有解决方案? –