如何在C中访问union中的struct成员?

时间:2012-09-29 14:21:34

标签: 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;
    };

} company[10];

如何访问联盟employee内的结构成员? 我尝试以这种方式访问​​age结构的manager成员:

company[i].manager.age

但我得error C2039: 'manager' : is not a member of 'employee'

4 个答案:

答案 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].sharescompany[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.agecompany[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 ,否则会产生编译时错误。