匿名结构/联合不是 C 标准的一部分,而是一个不太广泛的 GNU 扩展。
在您的特定示例中,一些编译器(主要是 GCC)将允许您通过例如company[i].shares
or访问管理器和工作人员的唯一变量company[i].department
,但company[i].age
它是模棱两可的,编译器将不知道是哪一个。您的方法类似于尝试定义
union {
int num;
float num;
} union_number;
这甚至不是有效的 C.
有两种方法可以解决这个问题。
a)将共享属性移到结构之外(邪恶的 GNU 方式,请不要这样做,我知道 icc 甚至不编译它)
union employee
{
char key;
struct person {
short int age;
union {
struct manager
{
float shares;
short int level;
};
struct worker
{
short int skill;
short int department;
};
}
};
} company[10];
b)或更简洁的标准化方式来命名您的结构:
union employee
{
char key;
struct manager
{
short int age;
float shares;
short int level;
} manager;
struct worker
{
short int age;
short int skill;
short int department;
} worker;
} company[10];
在这种情况下,您将能够通过 访问结构元素company[i].manager.age
,company[i].worker.skill
依此类推。
请注意,在运行时无法测试您的 union 是否包含密钥、经理或工人。这必须提前知道。
另一件事:我不确定这是否是有意的,但在您的声明中,您不能将密钥与经理或工人一起保存。您的工会仅包含关键、经理或工人之一