嵌套在union中的结构中的公共初始序列 - C标准中的定义

时间:2012-08-28 17:57:32

标签: c structure unions

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

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

1 个答案:

答案 0 :(得分:4)

  

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

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

这就是示例的作用:它将初始int作为alltypes的{​​{1}}成员, 之后将以下字段初始化为n,然后继续访问nf的{​​{1}}字段,全部使用相同的变量。

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

请注意,此保证已存在一段时间:基本上在ANSI specification部分中找到相同的文本: 3.3.2.3结构和联合成员