Ошибка: переопределение объединения
В следующем коде:
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;