如何在C中访问联合内部的结构成员?

如何在C中访问联合内部的结构成员?,c,unions,structure,C,Unions,Structure,我有以下工会: 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; }

我有以下工会:

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];
如何访问工会
员工
内部结构的成员? 我试图通过以下方式访问
manager
结构的
age
成员:

公司[i].经理.年龄


但是我得到
错误C2039:'manager':不是'employee'的成员

在标记声明之后添加一些内容。也许:

struct manager
{
    short int age;
    float shares;
    short int level;
} manager;
struct employee {
    char key;

    union {
        struct manager ...;
        struct worker ...;
    } u;
};

旁注:你没有正确使用工会。键,即告诉您是与经理打交道还是仅与工人打交道的字段,应位于工会外部的封闭对象中。也许:

struct manager
{
    short int age;
    float shares;
    short int level;
} manager;
struct employee {
    char key;

    union {
        struct manager ...;
        struct worker ...;
    } u;
};

如前所述,您可以在联合体之外声明您的经理/工作者标记。

匿名结构/联合体不是C标准的一部分,而是一个不太广泛的GNU扩展

在您的特定示例中,某些编译器(主要是GCC)将允许您通过例如
公司[i]。共享
公司[i]。部门
,但
公司[i]。年龄
不明确,编译器将不知道这是什么意思。您的方法类似于试图定义

 union {
      int num;
      float num;
 } union_number;
这甚至不是有效的C

有两种方法可以解决这个问题

a) 将共享属性移到结构之外(邪恶的GNU方式,请不要这样做,我知道事实上icc甚至没有编译这个)

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];
在这种情况下,您可以通过
公司[i].manager.age
公司[i].worker.skill
等访问结构元素

请注意,在运行时,无法测试您的工会是否包含密钥、经理或工作人员。这必须事先知道


另一件事:我不确定这是否是有意的,但在您的声明中,您不能与经理或工作人员一起保存密钥。您的联合体只包含一个键、管理器或工作器。此错误是因为您试图通过结构本身的名称访问结构元素,这是无效的。为了访问结构的元素,应该首先为其创建一个对象

在下面的代码中,manage和work分别是结构管理器和worker的对象

工会雇员 { 字符键

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扩展名文件\u 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];
这基本上会产生编译错误,因为它会发现manager和worker成员之间存在歧义

因此,如果您将代码更改为:

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扩展名,否则它将产生编译时错误。

+1关于使用
union
键的观察非常好!你可能想提到的是,没有必要在
工会
内部为
工人
经理
添加
struct
标记。啊,现在我意识到我在那里做了什么……我完全没有意识到使用工会的意义。是的,在cnicutar指出这一点后,我意识到了这一点。然后我把它改成:
struct company{char key;union employee{struct manager{short int int age;float shares;short int level;}manager;struct worker{short int age;short int int skill;short int int department;}worker;}employee;}comp[10]匿名结构和联合成员完全是标准的C11。