错误:重新定义联合

Gin*_*cob 12 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;
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 7

在那里没有名称与命名空间的分离,你实际上是在尝试重新定义.

片段:

typedef struct { union U { int a; char b; } U1; } A;
Run Code Online (Sandbox Code Playgroud)

这里没有显着差异:

union U { int a; char b; };
typedef struct { union U U1; } A;
Run Code Online (Sandbox Code Playgroud)

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

typedef struct { union AU { int a; char b; } U1; } A;
typedef struct { union BU { int a; char b; } U1; } B;
Run Code Online (Sandbox Code Playgroud)

或者,如果工会意思是(并将继续)同一类型,只是把它定义一次:

union U { int a; char b; };
typedef struct { union U U1; } A;
typedef struct { union U U1; } B;
Run Code Online (Sandbox Code Playgroud)


har*_*mic 5

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

你可以做到这一点:

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

typedef struct
{
    union U U1;
}B;
Run Code Online (Sandbox Code Playgroud)

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

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

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

typedef struct
{
    union
        {
            int a;
            char b;
        }U1;
}B;
Run Code Online (Sandbox Code Playgroud)