2

在 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::typenf::type作为标准状态),但在内部if我们使用nf::doublenode的不是公共初始序列的一部分。

有人可以澄清这个问题吗?

4

1 回答 1

4

允许检查[共享一个共同初始序列的几个结构]的共同初始部分

使用提供的示例,规范的这一部分是说,由于 的每个可能的成员类型union都有一个int作为初始字段,因此您可以使用任何成员类型访问该公共初始字段,即使在变量已经初始化/使用之后作为特定成员类型之一。

这正是该示例所做的:将后续字段初始化为 an 之后,它作为 an的int成员alltypes访问初始值,然后继续访问an 的字段,所有这些都使用相同的变量。nnfdoublenodenf

使用union作为一种可能的类型不会强制它进入某种结构:这就是联合的​​工作方式。

请注意,这种保证已经存在了一段时间:在ANSI 规范中可以找到基本相同的文本,第3.3.2.3 节结构和联合成员

于 2012-08-28T18:05:06.697 回答