Ошибка: переопределение объединения

В следующем коде:

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

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

Компилятор выдает сообщение об ошибке "[Ошибка] переопределения" union U ". Но эти союзы являются членами разных структур. Таким образом, как правило, нет никаких шансов на изменение переменных имен. Так в чем же причина этой ошибки?

Ответ 1

В вашем примере имя "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

Там нет разделения имен на пространства имен, вы на самом деле пытаетесь переопределить.

Отрывок:

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 U { int a; char b; };
typedef struct { union U U1; } A;
typedef struct { union U U1; } B;

Ответ 3

Даже если вы могли бы определить два союза с именем U, это было бы не очень полезно. В конце концов, какой союз вы бы имели в виду, если вы создали переменную union U? Если вы намереваетесь создавать такие переменные, тогда давайте разным названиям для профсоюзов, чтобы их устранить. С другой стороны, если вы никогда не намереваетесь создавать такие переменные, вы можете рассмотреть использование анонимных объединений:

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

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