初始化包含union的结构

时间:2014-07-21 09:46:17

标签: c struct unions

我有一些代码如下

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]

为什么会这样?

3 个答案:

答案 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 *'时不兼容的类型"现在,已经没有了。