10

我有以下工会:

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

4 回答 4

14

在标签声明之后添加一些东西。也许:

struct manager
{
    short int age;
    float shares;
    short int level;
} manager;

旁注:您没有使用联合权。关键,即告诉您是与经理打交道还是与普通工人打交道的字段应该位于union 之外的封闭对象中。也许:

struct employee {
    char key;

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

正如dasblinkenlight 所指出的,您可以在工会之外声明您的经理/工人标签。

于 2012-09-29T14:23:35.653 回答
4

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

在您的特定示例中,一些编译器(主要是 GCC)将允许您通过例如company[i].sharesor访问管理器和工作人员的唯一变量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.agecompany[i].worker.skill依此类推。

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

另一件事:我不确定这是否是有意的,但在您的声明中,您不能将密钥与经理或工人一起保存。您的工会仅包含关键、经理或工人之一

于 2012-09-29T17:51:50.457 回答
0

此错误是因为您试图通过结构本身的名称来访问结构元素,这是无效的。为了访问结构的元素,首先应该为它创建一个对象。

在下面的代码中,manage 和 work 分别是结构体 manager 和 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”

于 2014-01-06T05:06:22.543 回答
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在编译时未指定,否则会出现编译时错误。

于 2015-04-11T14:10:30.820 回答