为什么以下示例在C中不起作用?
#include <stdio.h>
typedef struct {
int x;
} X;
typedef struct {
char y[10];
} Y;
typedef struct {
int pos;
union {
X x;
Y y;
};
} Test;
int main() {
X x = { 65 };
Y y = { "Hallo" };
Test t = { 1, x }; // OK
printf("1: %d %d '%s'\n", t.pos, t.x.x, t.y.y);
Test t2 = { 2, y }; // ERROR
printf("2: %d %d '%s'\n", t2.pos, t2.x.x, t2.y.y);
Test t3 = { 3 }; // OK
printf("3: %d %d '%s'\n", t3.pos, t3.x.x, t3.y.y);
return 0;
}
main.c:在函数'main'中:
main.c:25:3:错误:使用类型'Y'初始化类型'int'时类型不兼容
测试t2 = {2,y}; //错误
^
编辑:顺便说一句:t2.y = y;
工作
因为未分析初始值设定项的类型,也不将其与的可能成员匹配union
。
相反,您只需要为第一个union
成员提供一个初始化程序。
C11草案§6.7.9.17:
每个用大括号括起来的初始化器列表都有一个关联的当前对象。如果没有指定,则根据当前对象的类型按顺序初始化当前对象的子对象:下标顺序递增的数组元素,声明顺序的结构成员以及并集的第一个命名成员。
如前所述,您可以使用指示符来控制此操作:
Test t2 = { 2, .y = y };
应该可以工作(.y
在C99中,这是一个指示符,“ new”)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句