联合体成员初始化出现问题

4
我正在尝试以下代码:

typedef union Data
{
   int i;
}data;

int main( )
{
   data d1;     
   d1.i = 10; // OK
   data d3 = {7};// OK
   data d2.i = 20; // Gives error
}

我的问题是为什么data d2.i = 20会出现错误,而其他的却可以正常工作?


"data d1 = {7};// OK" 应该已经报错了,因为您正在重新定义 "d1"。 - Jabberwocky
1
最后一行声明变量 d2,而在前面的初始化行中,变量 d1 已经被声明了。行 d1 = {7} 使用了一种特定的定义方式(初始化器列表),其中 {} 表示“按照指定顺序将这些成员放入”,而最后一行中没有这样的表达式,因此您试图声明一个名为 d2.i 的数据类型变量,并为整个对象赋值 20。 - Toby
1个回答

6
因为它不是有效的语法。
它与 union 没有关系,即对于 struct,情况也是一样的。
你正在尝试使用一个 union 成员的名称作为名称,这是无效的。名称不能包含点号 (.)。
初始化工作是因为初始值表达式 (右侧) 与左侧的类型有匹配 (某种程度上),但这不是你在最后一行尝试的。
我认为这样做会起作用,并且有点接近:
data d2 = { .i = 20 };

这里使用C99语法在初始化列表中命名目标成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接