C语言union初始化工作机制及多初始值编译报错原因咨询
报错的根本原因
首先明确C标准对联合体初始化的约束:联合体的所有成员共享同一块内存空间,同一时间仅能生效一个成员的值,因此C语言标准明确规定,普通初始化列表(未使用指定初始化器)初始化联合体时,最多只能提供1个初始值,该值默认用于初始化联合体声明的第一个成员。
你给出的代码里初始化列表提供了"Tom"和1两个初始值,不符合标准要求,因此会触发编译错误。
编译器的判断逻辑
编译器不是预先统计所有初始值的总数再判断是否合法,而是按顺序逐个解析初始化列表的元素,过程如下:
- 第一步解析第一个初始值
"Tom",匹配联合体的第一个成员char name[4],类型、长度都符合要求,这一步没有任何问题。 - 第二步解析到逗号分隔的第二个初始值
1时,编译器会检查当前正在初始化的联合体对象是否还有未分配初始值的占位位置:由于联合体仅支持一个初始值,已经没有可匹配的初始化目标,此时直接触发「初始化列表元素过多」的报错。
你可以做个简单验证:把初始化列表里的,1删掉,仅保留{"Tom"},代码可以正常编译运行,也能佐证是多余的第二个初始值触发了错误。
扩展补充
如果需要初始化联合体非第一个位置的成员,可以用C99引入的指定初始化器写法,依然只需要提供一个初始值,符合标准要求:
union id var = {.number = 1}; // 合法,明确初始化number成员
内容的提问来源于stack exchange,提问作者민예원
相关产品推荐
相关产品推荐

