Если вы хотите глобальную переменную; одна структура, доступная из нескольких модулей компиляции (файлы C ++):
/* foo.h */
#ifndef EXAMPLE_FOO_H
#define EXAMPLE_FOO_H
struct foo {
int a;
int b;
};
extern struct foo globalFoo;
#endif /* EXAMPLE_FOO_H */
-
/* foo.cpp */
#include "foo.h"
struct foo globalFoo = { 1, 2 };
-
/* bar1.cpp */
#include "foo.h"
int test1()
{
int c = globalFoo.b; //c is 2
}
-
/* bar2.cpp */
#include "foo.h"
int test2()
{
int x = globalFoo.a; //x is 1
}
Строка "struct {}" в foo.h сообщает компилятору, как выглядит struct foo. Строка "extern struct" объявляет конкретную структуру foo, называемую "globalFoo" с внешней связью. (Можно объединить эти два объявления, см. Ответ @ litb.) Это означает, что пользователи globalFoo (bar1 / test1 и bar2 / test2) будут искать структуру в другом месте, у них не будет своих собственных отдельных копий.
foo.cpp - это особый случай, который определяет globalFoo. У любой переменной может быть только одно определение, и в этом случае foo.cpp имеет определение globalFoo. Когда bar1 и bar2 ищут globalFoo «извне», они находят globalFoo для foo.cpp. Имя будет ссылаться на одну и ту же фактическую структуру во всех трех файлах.
Если бы extern
там не было, тогда все три файла .cpp содержали бы строку, которая гласила бы "struct foo globalFoo;" (Помните, что #include - это просто копирование / вставка). Это попыталось бы [создать] три разных структуры с одинаковым именем, что привело бы к путанице.
Примечание: строка "extern struct foo globalFoo;
" избыточна в случае foo.cpp, но это не имеет значения.