编译时间零C联合

Vio*_*let 1 c initialization unions

我有一个拥有大量领域的联盟,一些不确定的大小.我想创建一个预设值(以NULL为单位),其中union的每个字段都为零.我尝试了以下,但没有优化它可能会导致两个副本; 更重要的是,实际上并没有起作用.

标题:

extern union MyUnion my_union_zero;
Run Code Online (Sandbox Code Playgroud)

资源:

static char my_union_zero_arr[sizeof(union MyUnion)] = {0};
union MyUnion my_union_zero = (union MyUnion)my_union_zero_arr;
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗 有没有一种标准的方法来实现这一目标?

Ded*_*tor 7

只是用

static union MyUnion my_union_zero;
Run Code Online (Sandbox Code Playgroud)

并依靠编译器来做所有的零初始化.


在此之后只有法律和历史.如果你愿意,请继续阅读.

n1331复述:

  1. K&R-C:未初始化的静态对象从0开始.(注意,没有引用空指针很奇怪.)

    未初始化的静态和外部变量保证从0开始; 未初始化的自动和寄存器变量保证以垃圾开始.

  2. C89:所有算术成员初始化为0,所有指针成员初始化为空指针.(注意填充被遗忘了(在这种情况下,无论如何都不存在union.另外,没有人注意到空指针可能不是全位 - 零.)

    如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就好像每个具有算术类型的成员都被赋值为0,并且每个具有指针类型的成员都被赋予空指针常量.

  3. DR_016:提醒空指针很奇怪,这会使许多union人形成错误.委员会决定只对第一个成员进行初始化,这打破了许多计划(尽管不打算这样做).

  4. C99:纳入DR分辨率,以获得:

    • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
  5. C11:更正了错误:

    6.7.9初始化

    10如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态或线程存储持续时间的对象,则:

    • 如果它有指针类型,则将其初始化为空指针;
    • 如果它有算术类型,则初始化为(正或无符号)零;
    • 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;
    • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;