这个结构/联合声明有什么问题?

时间:2014-05-13 11:29:40

标签: c struct unions

我在全球范围内声明了这个结构,

struct a{
int a;
int x;
union b{
int a;
int b;
int y;
};
};

然后在main中声明了一个联盟,

union b a;

这并没有给出任何错误。但如果在结构定义中声明联合'a',例如:

struct a{
int a;
int x;
union b{
int a;
int b;
int y;
}a;
};

它给出错误“重复成员a”。 (我们在之前的案例中使用了同一个名字'a') 为什么一个工作而另一个不工作?

其次,我们如何独立地使用struct内部声明的union,但不能使用任何其他整数变量,比如'x'? 就像,我可以成功执行以下操作:

union b z;  //works in this case, BUT not if we declare 'z' with the definition.
z.y=6;      //works
x=6;        //gives error

(我知道我们在main中声明了union,但是它在struct中的定义。就像struct.union.union_variable一样有意义,但是union.union_variable直接使它变得独立。不应该像对待它一样'X'?)

1 个答案:

答案 0 :(得分:5)

  

它给出错误“重复成员a”。 (我们在以前的案例中使用了同一个名称'为什么一个人工作而另一个人不工作?

因为您的结构现在有两个名为a的成员:第一个是int,第二个是b类型(您的union)。如果不能编译,你不会感到惊讶:

struct a {
    int a;
    float a;
};

在你的情况下,你有完全相同的情况,你在b之外定义了struct的图像,你试着像这样使用它:

struct a {
    int a;
    union b a;
};
  

其次,我们如何独立地使用struct内部声明的union,但不能使用任何其他整数变量,比如'x'?就像,我可以成功执行以下操作:

x在哪里宣布?您没有任何名为x的局部变量(您可能拥有的是名为x的结构成员,但您需要这样的结构)。以下之一(根据您的尝试):

int x = 6;
struct a w;
a.x = 6;