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

nis*_*002 0 c struct unions

我在全球范围内宣布了这种结构,

struct a{
int a;
int x;
union b{
int a;
int b;
int y;
};
};
Run Code Online (Sandbox Code Playgroud)

然后在主要内部宣布一个联盟,

union b a;
Run Code Online (Sandbox Code Playgroud)

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

struct a{
int a;
int x;
union b{
int a;
int b;
int y;
}a;
};
Run Code Online (Sandbox Code Playgroud)

它给出错误"重复成员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
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*tti 5

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

因为你的结构现在有两个名为的成员a:第一个是第一个int,第二个是类型b(你的union).你不会惊讶地发现这不能编译:

struct a {
    int a;
    float a;
};
Run Code Online (Sandbox Code Playgroud)

在你的情况下你有完全相同的情况,你b在外面定义的成像struct,你尝试使用它像这样:

struct a {
    int a;
    union b a;
};
Run Code Online (Sandbox Code Playgroud)

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

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

int x = 6;
struct a w;
a.x = 6;
Run Code Online (Sandbox Code Playgroud)