我有以下联盟:
union employee
{
char key;
struct manager
{
short int age;
float shares;
short int level;
};
struct worker
{
short int age;
short int skill;
short int department;
};
} company[10];
如何访问联盟employee
内的结构成员?
我尝试以这种方式访问age
结构的manager
成员:
company[i].manager.age
但我得error C2039: 'manager' : is not a member of 'employee'
。
答案 0 :(得分:10)
在标记声明后添加内容。也许:
struct manager
{
short int age;
float shares;
short int level;
} manager;
旁注:你没有正确使用工会。关键,即告诉您是在与经理或仅与工人打交道的领域,应该在一个封闭的对象中,在工会之外。也许:
struct employee {
char key;
union {
struct manager ...;
struct worker ...;
} u;
};
如dasblinkenlight所述,您可以在联盟之外声明您的经理/工作人员标签。
答案 1 :(得分:2)
匿名结构/联合不是C标准的一部分,而是一个不太广泛的GNU扩展。
在您的特定示例中,一些编译器(主要是GCC)将允许您通过例如访问管理器和工作人员唯一变量。 company[i].shares
或company[i].department
,但company[i].age
不明确,编译器不知道哪一个是什么意思。您的方法类似于尝试定义
union {
int num;
float num;
} union_number;
甚至不是有效的C.
有两种方法可以解决这个问题。
a)将共享属性移到struct之外(邪恶的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
等访问结构元素。
请注意,在运行时,无法测试您的联盟是否包含密钥,经理或工作人员。必须提前知道。
另一件事:我不确定这是否有意,但在您的声明中,您无法将密钥与经理或工人一起保存。您的联盟仅包含一个密钥,经理或工作人员
答案 2 :(得分:0)
此错误是因为您尝试通过结构本身的名称访问结构元素,这是无效的。为了访问结构的元素,首先应该为它创建一个对象。
在下面的代码中,manage和work分别是结构管理器和worker的对象。
工会员工 { char key;struct manager
{
short int age;
float shares;
short int level;
}manage;
struct worker
{
short int age;
short int skill;
short int department;
}work;
}公司[10];
现在要访问该成员,您可以使用“company [i] .manage.age”
答案 3 :(得分:0)
您可以按照您尝试的方式访问成员(但联盟内部的结构应该具有唯一成员)但您应该确保在编译代码 gcc 时应该知道您正在尝试这样,
命令: gcc -fms-extensions file_name.c
,支持来自c11。
喜欢:
union employee
{
char key;
struct manager
{
short int age;
float shares;
short int level;
};
struct worker
{
short int age;
short int skill;
short int department;
};
} company[10];
这基本上会产生编译错误,因为它会发现管理员和工作人员之间存在歧义。
因此,如果您将代码更改为:
union employee
{
char key;
struct manager
{
short int age;
float shares;
short int level;
};
struct worker
{
short int age1;
short int skill;
short int department;
};
} company[10];
或者你可以直接保持联盟。
除非您在编译时未指定 -fms-extensions
,否则会产生编译时错误。