ANSI C

时间:2015-12-24 11:26:39

标签: c ansi anonymous-struct

我想知道是否可以在ANSI C中声明匿名结构。我的代码是:

struct A
{
    int x;
};

struct B
{
    struct A;
    int y;
};

当我编译它时,我得到: 警告:声明未声明任何内容

我已经读过标志-fms-extensions可以解决这个问题,但它只适用于Windows系统,因为它产生: 警告:匿名结构是Microsoft扩展[-Wrosrosoft]

我可以使用任何ANSI等效扩展吗?

3 个答案:

答案 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 );