错误:重新定义联合

时间:2014-02-05 05:55:53

标签: c struct compiler-errors unions

在以下代码中:

typedef struct
{
    union U
        {
            int a;
            char b;
        }U1;
}A;

typedef struct
{
    union U
        {
            int a;
            char b;
        }U1;
}B;

编译器给出错误“[错误]重新定义'union U'”。 但这些工会是不同结构的成员。 因此通常不存在可变名称干扰的可能性。 那么这个错误的原因是什么?

3 个答案:

答案 0 :(得分:7)

那里没有名称与命名空间的分离,你实际上 试图重新定义。

摘录:

typedef struct { union U { int a; char b; } U1; } A;

在这里没有显着差异:

union U { int a; char b; };
typedef struct { union U U1; } A;

您可以通过简单地为您的类型引入人工命名空间来解决它:

typedef struct { union AU { int a; char b; } U1; } A;
typedef struct { union BU { int a; char b; } U1; } B;

或者,如果union 意味着(并将保持)相同类型,只需将其定义为一次:

union U { int a; char b; };
typedef struct { union U U1; } A;
typedef struct { union U U1; } B;

答案 1 :(得分:5)

示例中的名称“U”是联合名称,而“U1”是每个结构“A”和“B”中联合的实例的名称”。 U1可以重复使用,但名称“U”在整个文件中都有范围。

你可以这样做:

typedef struct
{
    union U
        {
            int a;
            char b;
        }U1;
}A;

typedef struct
{
    union U U1;
}B;

因为A.U1和B.U1都有相同的声明。否则,您必须为联合使用不同的名称。

或者,只使用匿名联盟(即根本不提供联盟的名称):

typedef struct
{
    union
        {
            int a;
            char b;
        }U1;
}A;

typedef struct
{
    union
        {
            int a;
            char b;
        }U1;
}B;

答案 2 :(得分:3)

即使您可以定义名为U的两个联合,它也不会非常有用。毕竟,如果你创建了一个union U变量,你指的是哪个联盟?如果您打算创建此类变量,请为联合提供不同的名称以消除歧义。另一方面,如果您从未打算创建此类变量,那么您可以考虑使用匿名联合:

typedef struct {
    union {
        int a;
        char b;
    }U1;
}A;

typedef struct {
    union {
        int a;
        char b;
    }U1;
}B;