结构初始化中的匿名联合

韦科

为什么以下示例在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章