在以下代码中:
typedef struct
{
union U
{
int a;
char b;
}U1;
}A;
typedef struct
{
union U
{
int a;
char b;
}U1;
}B;
编译器给出错误“[错误]重新定义'union U'”。 但这些工会是不同结构的成员。 因此通常不存在可变名称干扰的可能性。 那么这个错误的原因是什么?
答案 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;