[英]How to access a struct member inside a union in C?
我有以下联盟:
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
内部的结构成员? 我尝试以这种方式访问manager
结构的age
成员:
company[i].manager.age
但我收到error C2039: 'manager' : is not a member of 'employee'
。
在标记声明后添加一些内容。 也许:
struct manager
{
short int age;
float shares;
short int level;
} manager;
旁注:你没有正确使用工会。 关键,即告诉您是在与经理或仅与工人打交道的领域,应该在工会之外的附件中 。 也许:
struct employee {
char key;
union {
struct manager ...;
struct worker ...;
} u;
};
正如dasblinkenlight所说,你可以在联盟之外声明你的经理/工人标签。
匿名结构/联合不是C标准的一部分,而是一个不太广泛的GNU扩展。
在您的特定示例中,一些编译器(主要是GCC)将允许您通过例如company[i].shares
或company[i].department
访问manager和worker唯一变量,但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
等访问struct元素。
请注意,在运行时,无法测试您的联合是否包含密钥,经理或工作人员。 必须提前知道。
另一件事:我不确定这是否有意,但在您的声明中,您无法与经理或工人一起保存密钥。 你的工会只包含的关键,经理或工人一个
此错误是因为您尝试通过结构本身的名称访问结构元素,这是无效的。 为了访问结构的元素,首先应该为它创建一个对象。
在下面的代码中,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”
您可以按照您尝试的方式访问成员(但是联合内部的结构应该具有唯一成员)但是您应该确保在编译代码时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
,否则会产生编译时错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.