【发布时间】:2021-03-21 17:58:56
【问题描述】:
我有以下联合和结构的结构
union ab {
struct {
int a;
} a_st;
struct {
int b;
} b_st;
};
typedef struct c {
union ab;
} c_st;
当试图直接“到达”联合元素时:
c_st c;
printf("%d\n", c.a_st.a);
引发以下编译错误:
错误:'c_st' {aka 'struct c'} 没有名为 'a_st' 的成员
如果我在 'c_st' 结构中提供联合名称(例如 ab_un),它可以工作,但我需要调用 c.ab_un.a_st.a,这是不太需要的。
这是必要的邪恶还是我在这里错过了什么?
提前致谢
【问题讨论】:
-
struct c { union ab; }你没有收到警告吗? -
@Jean-ClaudeArbaut - 从stackoverflow.com/questions/1972003/… 选择的答案有效,谢谢!
-
仅供参考,C 2018 标准在 6.7.2.1 13 中指定匿名成员。它说匿名成员由“没有标签的结构说明符”或“没有标签的联合说明符”指定。换句话说,
union ab;没有指定匿名成员;它有一个标签,是union ab类型的重新声明(由于其他原因,它具有未定义的行为)。因此,每个 6.7.2.1 13 的匿名工会成员必须具有union { member declarations here };的形式。 (由于union ab;声明具有标准未定义的行为,因此可以将其用于扩展,如答案中所述。)