工会内无名的联盟

我正在阅读一些代码,发现如下内容:

typedef union { int int32; int boolean; time_t date; char *string; union { struct foo *a; struct foo *b; struct foo *c; }; } type_t; 

从语法的角度来看,内部union {}可以被删除,并且* a,* b和* c直接位于外部union {}内。 那么无名嵌入式联盟的目的是什么?

另一个union / struct中未命名的union / struct是C11的一个特性,以及一些编译器扩展(例如, GCC )。

C11§6.7.2.1结构和联合说明符

13 类型说明符是没有标记的结构说明符的未命名成员称为匿名结构; 一个未命名的成员,其类型说明符是一个没有标记的联合说明符,称为匿名联合。 匿名结构或联合的成员被视为包含结构或联合的成员。 如果包含的结构或联合也是匿名的,则递归应用。

此function的优点是可以更轻松地访问其未命名的联合字段:

 type_t x; 

要访问字段a ,您只需使用xa 。 与代码比较而不使用此function:

 typedef union { int int32; int boolean; time_t date; char *string; union u{ //difference in here struct foo *a; struct foo *b; struct foo *c; }; } type_t; type_t x; 

你需要使用xua

相关: C中未命名的struct / union

我认为预期的用例更像是“ 结构中的匿名联合”,并且“联合内部的匿名联合”与“扁平”联合相同的行为只是一致性的可接受的折衷。

允许将同一指针称为a,b或c。 也许有一些遗留代码无法就要使用的名称达成一致。