【问题标题】:Initialise a structure containing a union初始化包含联合的结构
【发布时间】:2014-07-21 09:46:16
【问题描述】:

我有一些代码如下

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]

为什么会这样?

【问题讨论】:

  • 不要使用前导下划线后跟大写字母,这样的名称由规范保留。

标签: c struct unions


【解决方案1】:

在您的声明中:

Info groupFields = { 0, {groupType}};

groupType 值的类型为 DisplayGroup,它不是第一个 union display 成员的类型。联合只能使用其第一个成员的类型值进行初始化,即此处为 DisplayString 类型的初始化器。

【讨论】:

    【解决方案2】:

    我希望这个明确的定义可以帮助您了解发生了什么:

    Info infoField = { .x = 0, .Display = {.displayString = stringType}};
    Info groupFields = { .x = 0, .Display = {.displayGroup = groupType}};
    

    您至少必须定义您选择的联合变体:

    Info infoField = { 0, {.displayString = stringType}};
    Info groupFields = { 0, {.displayGroup = groupType}};
    

    【讨论】:

      【解决方案3】:

      我认为您应该将 display 联合声明为:

      union display
      {
          DisplayString displayString;
          DisplayGroup  displayGroup;
      };
      

      或者:

      typedef union display
      {
          DisplayString displayString;
          DisplayGroup  displayGroup;
      }Display;
      

      我只是尝试用 gcc 编译。原代码编译报错:“incompatible types when initializing type ‘char *’ using type ‘DisplayGroup’”。现在没有了。

      【讨论】:

      • 第一个使联合未命名,因此无法再通过名称引用它,这可能需要重构 OPs 代码(可能需要大量工作)。第二个例子没有创建成员Display,而是创建了一个类型别名Display
      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2013-01-25
      • 2022-08-15
      • 2017-09-17
      相关资源
      最近更新 更多