Struct初始化程序中的匿名联合

Wae*_*eCo 6 c struct initialization unions

为什么以下示例在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;
}
Run Code Online (Sandbox Code Playgroud)

main.c:在函数'main'中:
main.c:25:3:错误:使用类型'Y'初始化类型'int'时不兼容的类型
测试t2 = {2,y}; //错误
^

编辑:顺便说一句:t2.y = y;工作

unw*_*ind 6

因为初始化程序的类型没有被分析并与可能的成员匹配union.

相反,您只是应该为第一个union成员提供初始化程序.

C11草案§6.7.9.17:

每个大括号括起的初始化列表都有一个关联的当前对象.当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员.

如上所述,您可以使用指示符来控制:

Test t2 = { 2, .y = y };
Run Code Online (Sandbox Code Playgroud)

应该工作(这.y是一个指示符,C99中的"新").