C结构内部并集结构内部并集
如何初始化结构为B或C的变量C结构内部并集结构内部并集,c,struct,unions,C,Struct,Unions,如何初始化结构为B或C的变量 typedef struct _A { union { struct { int b; } B; struct { int c; } C; } u; } A; 差不多 A.u.B*bVar不起作用类型定义仅涵盖A,而不包括其中定义的联合或结构 typedef不能那样嵌套-每个用户定义的“type”必须有一个标签,因此声明类型为a.u.B的变量是非法的。这应该做到: /* Initi
typedef struct _A
{
union
{
struct
{
int b;
} B;
struct
{
int c;
} C;
} u;
} A;
差不多
A.u.B*bVar代码>不起作用类型定义
仅涵盖A
,而不包括其中定义的联合或结构
typedef
不能那样嵌套-每个用户定义的“type”必须有一个标签,因此声明类型为a.u.B
的变量是非法的。这应该做到:
/* Initialise to zero */
A a = {{{0},{0}}};
/* Now set the b to 5 */
a.u.B.b = 5;
如果仔细观察花括号,就会发现它们与类型声明中的括号完全匹配。因此,第一个括号开始于A
,第二个括号开始于A.u
,第三个括号开始于A.u.B
,第一个0
对应于A.u.B
。关闭大括号完成A.u.B
,然后逗号表示下一个打开大括号开始A.u.C
,因此第二个零初始化A.u.C.C
,然后所有大括号再次关闭
注意:并非所有编译器都支持匿名结构。我记不清标准是否允许使用它们……您应该将您的结构声明在一旁
typedef struct {
int b;
} B;
所以我不能初始化为
A.u.B=5
?@不,因为(根据我的回答)没有A.u.B
这样的类型。你必须声明一个a
类型的变量,然后设置它的内容。@Alnitak是正确的,它不是真正的“a.u.B”。我刚才用这个符号解释了大括号如何初始化。你的意思是分别声明B和C,并将它们包含在联合体中的atypedef结构{union{struct B;struct C;}u;}a代码>是的。然后您可以使用此类型。@但是请注意,如果您声明一个独立的B
,它将不会自动成为封闭的a
@Alnitak的一部分。是的,我理解that@Nitrate如果您已经typedef B
和C
了,那么您的A
就是typedef结构{union{bb;cc;}u;}A代码>-不再需要使用struct
来引用B
和C
。