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)
我错过了一些明显的东西吗 有没有一种标准的方法来实现这一目标?
只是用
static union MyUnion my_union_zero;
Run Code Online (Sandbox Code Playgroud)
并依靠编译器来做所有的零初始化.
在此之后只有法律和历史.如果你愿意,请继续阅读.
从n1331复述:
K&R-C:未初始化的静态对象从0开始.(注意,没有引用空指针很奇怪.)
未初始化的静态和外部变量保证从0开始; 未初始化的自动和寄存器变量保证以垃圾开始.
C89:所有算术成员初始化为0,所有指针成员初始化为空指针.(注意填充被遗忘了(在这种情况下,无论如何都不存在union.另外,没有人注意到空指针可能不是全位 - 零.)
如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就好像每个具有算术类型的成员都被赋值为0,并且每个具有指针类型的成员都被赋予空指针常量.
DR_016:提醒空指针很奇怪,这会使许多union人形成错误.委员会决定只对第一个成员进行初始化,这打破了许多计划(尽管不打算这样做).
C99:纳入DR分辨率,以获得:
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
C11:更正了错误:
6.7.9初始化
10如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态或线程存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;