2015-12-24 88 views
1

我想知道是否有可能在ANSI C.声明匿名结构我的代码是:匿名结构与ANSI C

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    struct A; 
    int y; 
}; 

当我编译它,我得到: 警告:不申报不申报任何

我已阅读该标志-fms-extensions的伎俩,但它仅适用于Windows系统,因为它产生: 警告:匿名结构是微软扩展[-Wmicrosoft]

是否有我可以使用的任何ANSI等效扩展?

+0

没有标识符的'struct'?不,我不这么认为。您可以声明一个没有类型名称的'struct',但是带有'struct {}标识符的标识符''。'struct's'成员具有明确的范围,那么如何在没有标识符的情况下处理成员呢? – Downvoter

+2

ANSI C没有此功能。你仅限于ANSI C还是可以使用C99或C11? – fuz

+0

我可以使用C99和C11,有没有解决方案? –

回答

1

了一个小窍门得到几乎此功能在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中匿名成员的更多详细信息。

0

你想这样的事情我猜想

struct B { 
    struct { 
     int x; 
    } A; 
    int y; 
}; 

而且你可以这样做:

struct B b; 
b.A.x = 5; 
printf("%d\n", b.A.x); 
+2

不,这不是匿名的:你仍然必须做'foo.A.x'而不是想要的'foo.x'。 – fuz

+0

这是不可能在C我认为... – Popiel

+1

[在C11中有可能](https://ideone.com/VKkdGY)。 – jweyrich

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进行访问。

+4

您应该澄清,这是C11的新功能,因为OP在讨论ANSI C.并且,谢谢您以简明的形式复制我的答案的内容。 – fuz

+0

@FUZxxl;在你看来,内容是从你的答案中获得的,但事实并非如此。我从[这里](https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html)中拿出了这个例子,稍作修改。顺便说一句,现在改变了整个内容。 – haccks

+1

我不是说你拿我的答案。我说你的答案是多余的,因为它说的是我在我的答案中所说的相同的东西(有些简明)。但无论如何,我不应该在意。 – fuz