在 C11 标准中,嵌套在单个联合中的结构共享的公共初始序列定义如下:
6.5.2.3/6
一个特殊的保证是为了简化联合的使用:如果一个联合包含多个共享一个公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许检查公共它们中的任何一个的初始部分,在任何地方都可以看到已完成联合类型的声明。如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(并且对于位域,具有相同的宽度),则两个结构共享一个共同的初始序列。
示例 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
作为标准状态),但在内部if
我们使用nf::doublenode
的不是公共初始序列的一部分。
有人可以澄清这个问题吗?