联合初始化如何工作?

How union initialization works?

问题来自我的C书上的一个练习题。

07。从编译器的角度来看,为什么这段代码会失败?

union id { char name[4]; long number; } var = { "Tom", 1 };

我知道初始化值太多会出错

但我的问题是为什么会出错

C编译器是不是只统计值的个数是否为1?或者 C 编译器的工作方式就像接受第一个值,如果有其他值返回错误?

也许这两个概念看起来很相似,但它们并不相同。如果你明白了,请帮助我回答。

初始化规则在C 2018 6.7.9中。初始化器可以有指示符,例如 union id var = { .number = 1 };,以按名称显式初始化特定的联合成员。在您展示的情况下,第 17 段没有指示符:

… When no designations are present, subobjects of the current object are initialized in order according to the type of the current object: array elements in increasing subscript order, structure members in declaration order, and the first named member of a union…

这样做的结果是只有一件事要初始化,即联合的第一个命名成员。没有列出其他候选人。这意味着,在您显示的两个初始化器中,“Tom” 用于初始化成员 name,而 1 没有任何要初始化的东西。即使联合体中有另一个成员,初始化联合体成员的规则也没有说要使用更多的初始化器。

所以编译器会报错,因为 1 不属于那里。