联合初始化如何工作?
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
不属于那里。
问题来自我的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
不属于那里。