我正在阅读一些代码并发现类似以下内容:
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 {} 内部。那么无名嵌入联盟的目的是什么?
另一个联合/结构内的未命名联合/结构是 C11 的一个功能,以及一些编译器扩展(例如,GCC http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html).
C11 §6.7.2.1 结构和联合说明符
13
类型说明符是不带标记的结构说明符的未命名成员称为匿名结构;类型说明符是不带标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含的结构或联合也是匿名的,则这会递归地应用。
此功能的优点是可以更轻松地访问其未命名联合字段:
type_t x;
访问该字段a
,你可以简单地使用x.a
。与不使用此功能的代码进行比较:
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;
你需要使用x.u.a
.
有关的:C 中的未命名结构/联合 https://stackoverflow.com/q/13376494/1009479
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)