我有一些代码如下
typedef struct _DisplayString
{
char* string;
}DisplayString;
typedef struct _DisplayGroup
{
char groupName[10];
int groupType;
}DisplayGroup;
typedef struct _Info {
int x;
union display
{
DisplayString displayString;
DisplayGroup displayGroup;
}Display;
}Info;
int main(void) {
DisplayString stringType;
DisplayGroup groupType;
Info infoField = { 0, {stringType}};
Info groupFields = { 0, {groupType}};
return 0;
}
我正在尝试初始化结构字段。 我在初始化groupFields数据变量
的行上遇到编译器错误gcc -Wall -g settings.c
settings.c: In function ‘main’:
settings.c:29:5: warning: missing braces around initializer [-Wmissing-braces]
settings.c:29:5: warning: (near initialization for ‘groupFields.Display.displayString’) [-Wmissing-braces]
settings.c:29:5: error: incompatible types when initializing type ‘char *’ using type ‘DisplayGroup’
settings.c:29:10: warning: unused variable ‘groupFields’ [-Wunused-variable]
settings.c:28:10: warning: unused variable ‘infoField’ [-Wunused-variable]
为什么会这样?
答案 0 :(得分:2)
在你的声明中:
Info groupFields = { 0, {groupType}};
groupType
值的类型为DisplayGroup
,而不是第一个union display
成员的类型。联合只能使用其第一个成员的类型值初始化,即此处类型为DisplayString
的初始化程序。
答案 1 :(得分:1)
我希望这个明确的定义可以帮助您了解正在发生的事情:
Info infoField = { .x = 0, .Display = {.displayString = stringType}};
Info groupFields = { .x = 0, .Display = {.displayGroup = groupType}};
您必须至少定义您选择的联合变体:
Info infoField = { 0, {.displayString = stringType}};
Info groupFields = { 0, {.displayGroup = groupType}};
答案 2 :(得分:0)
我认为您应该将显示联合声明为:
union display
{
DisplayString displayString;
DisplayGroup displayGroup;
};
或者:
typedef union display
{
DisplayString displayString;
DisplayGroup displayGroup;
}Display;
我只是尝试用gcc编译。原始代码有一个编译错误:"使用类型'DisplayGroup'初始化类型'char *'时不兼容的类型"现在,已经没有了。