c - 结构初始化器中的匿名 union

标签 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;
}

main.c: In function ‘main’:
main.c:25:3: error: incompatible types when initializing type ‘int’ using type ‘Y’
Test t2 = { 2, y }; // ERROR
^

编辑: 顺便说一下:t2.y = y; 有效

最佳答案

因为未针对 union 的可能成员分析和匹配初始化程序的类型。

相反,您应该简单地为第一个 union 成员提供一个初始化程序。

C11 草案 §6.7.9.17:

Each brace-enclosed initializer list has an associated current object. When no designations are present, subobjects of the current object are initialized in order according to the type of the current object: array elements in increasing subscript order, structure members in declaration order, and the first named member of a union.

如前所述,您可以使用指示符来控制这一点:

Test t2 = { 2, .y = y };

应该可以工作(.y 是一个指示符,在 C99 中是“新的”)。

关于c - 结构初始化器中的匿名 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29915058/

相关文章:

在嵌入式 C 中创建寄存器的可迭代列表

c - C中lstat fstat和stat的区别

c++ - 无法将不完整类型 'void *' 的参数转换为 'const bitData'

c - 在 RVDS 5.01 上隐式声明的函数 "typeof"

c - 这些 C 函数签名与我以前看到的不同。这些是做什么的,为什么这样写?

c - 结构体中的数组和初始化

python - 如何在 Python 中初始化嵌套字典

arrays - Go:空花括号对数组初始化内存分配的影响

python - 在多级继承中未调用父初始值设定项?

c - 使用 libpq 在表中插入 float