在C11标准中,嵌套在单个联合中的结构共享以下共同初始序列的定义:
6.5.2.3/6
为简化工会的使用,我们做出了一项特殊保证: 如果联合包含多个共享公共首字母的结构 序列(见下文),如果union对象当前包含一个 在这些结构中,允许检查共同的初始 任何一个声明已完成类型的部分 工会是可见的。两个结构共享一个公共首字母 序列如果相应的成员具有兼容的类型(并且,对于 比特字段,相同的宽度)用于一个或多个初始序列 成员。
示例3以下是有效的片段:
union { struct { int alltypes; } n; struct { int type; int intnode; } ni; struct { int type; double doublenode; } nf; } u; u.nf.type = 1; u.nf.doublenode = 3.14; /* ... */ if (u.n.alltypes == 1) if (sin(u.nf.doublenode) == 0.0) /* ... */
根据我对本文的理解,上述代码无效。
在外部if
语句中,我们指出n::alltypes
数据成员处于活动状态(同时以ni::type
和nf::type
作为标准状态)但在内部{{1我们使用的if
不是公共初始序列的一部分。
有人可以澄清这个问题吗?
答案 0 :(得分:4)
允许检查[具有共同初始序列的几个结构]的共同初始部分
使用提供的示例,规范的这一部分是说,由于union
的每个可能成员类型都有int
作为初始字段,因此您可以使用任何成员类型,即使该变量已被初始化/用作特定成员类型之一。
这就是示例的作用:它将初始int
作为alltypes
的{{1}}成员, 之后将以下字段初始化为n
,然后继续访问nf
的{{1}}字段,全部使用相同的变量。
使用doublenode
作为可能的类型之一并不会强制它进入某种结构:这就是联合的工作方式。
请注意,此保证已存在一段时间:基本上在ANSI specification部分中找到相同的文本: 3.3.2.3结构和联合成员。