Extern безымянное определение объекта структуры

У меня есть глобальный объект типа «безымянная структура», и я пытаюсь его определить. Я не хочу засорять свое глобальное пространство имен таким бесполезным типом (он будет использоваться только один раз).

Global.h

extern struct {

    int x;

} A;

Есть ли правильный способ определить такой объект?
Я пробовал это:

Global.cpp

struct {

    int x;

} A = { 0 };

Но VS2012 выдает «ошибку C2371: 'A': переопределение; различные базовые типы». Спасибо.


person HemoGoblin    schedule 05.07.2012    source источник
comment
Если он используется только один раз, зачем вы помещаете его в файл .h?   -  person Hans Passant    schedule 05.07.2012
comment
Я использую его во всем своем проекте, он глобальный.   -  person HemoGoblin    schedule 05.07.2012
comment
@HansPassant: У него только один экземпляр класса.   -  person Mooing Duck    schedule 05.07.2012


Ответы (3)


Одно из возможных решений: создайте другой файл Global_A.cpp, который не включает Global.h, и определите там A. По правилу эквивалентного определения это будет действительно до тех пор, пока определения анонимных структур эквивалентны.

Это все еще плохая идея, и большинство компиляторов предупредят об этом, например. (gcc): предупреждение: нелокальная переменная `‹ анонимная структура> A 'использует анонимный тип.

person ecatmur    schedule 05.07.2012

Невозможно сделать это просто потому, что это может привести к ошибкам: когда-нибудь в будущем кто-то (возможно, даже вы) может захотеть изменить определение этой структуры, и он может забыть сделать это в заголовочном и исходном файлах соответственно. Поэтому вам придется придумать имя для этой структуры и использовать его имя как исходный файл, а определение оставить до заголовка.

person unkulunkulu    schedule 05.07.2012

Не знаю, поможет ли это вам, и это мой первый пост ... Так что расслабьтесь.

Я только что столкнулся с этой проблемой, и я добавил функцию, которая управляет структурой в файл, содержащий анонимную структуру. Таким образом, я могу вызвать эту функцию из любого файла в моем проекте, и она будет управлять значениями в структуре вместо меня.

Вот пример:

header.c имеет анонимную структуру:

 struct 
   {    
       char  line1[80];
       char  line2[80];
       char  line3[80];
   } header;

Я хочу управлять этими значениями в «interface.c», потому что я создаю интерфейс командной строки в другом файле. Моим первым побуждением было использовать extern, но похоже, что добавление следующей функции в header.c так же хорошо или лучше (некоторые люди не рекомендуют использовать externs, если этого можно избежать).

void changeHeaders(char *one, char *two, char *three);
void changeHeaders(char *one, char *two, char *three)
{

    strcpy(header.line1, one);
    printf("\nHeader 1: %s", header.line1);
    strcpy(header.line2, two);
    printf("\nHeader 2: %s", header.line2);
    strcpy(header.line3, three);
    printf("\nHeader 3: %s", header.line3);

}

Теперь, пока я включаю прототип для этой функции, я могу управлять этими структурными переменными из любого файла с помощью этой функции. Надеюсь, это кому-то поможет.

person Dugan    schedule 03.09.2014