2015-12-09 3 views
0

У меня возникла проблема с объявлением переменной extern. У меня есть куча .cpp файлов, содержащих определения структур:Внешняя переменная undefined

const System SystemA = {"A", 1, 2 ...}; //In A.cpp 
const System SystemB = {"B", 1, 2 ...}; //In B.cpp 
... 

Эти файлы СРР только к серверу как простой способ добавления новых структур, а также искать для одного конкретного определения структуры легко. (так как у меня может быть 100 определений, и каждая из них является несколькими [50] строками кода).

Когда я пытаюсь использовать их в другом модуле компиляции (.cpp):

extern const System SystemA; 
extern const System SystemB; 
... 

void InitStructs(){ 
    SystemA.Init(); 
    SystemB.Init(); 
    ... 
} 

Я просто undefined reference to SystemAundefined reference to SystemB, и так далее. Я делаю эту унифицированную инициализацию, потому что я выполнял инициализацию как статическую динамическую инициализацию в каждой системе system.cpp. Но это рискованно, так как порядок инициализации не гарантируется (фиаско порядка статической инициализации). Поэтому я получал ошибки сегментации в зависимости от порядка компиляции cpp.

Я перешел к этому подходу, но теперь он даже не компилирует .... Любая помощь?

ответ

1

В C++, const объекты в глобальной области по умолчанию также являются static, т. е. они не видны вне исходного файла. Чтобы исправить это, добавьте extern к каждому из определений.

+0

Я отмечаю это как ответ, потому что на самом деле это объясняет, что C и C++ не совпадают. C по умолчанию используется extern, тогда как C++ по умолчанию статично для константных переменных. – DarkZeros

1

SystemA и SystemB должны быть определены с ключевым словом extern, тоже:

extern const System SystemA = {"A", 1, 2 ...}; //In A.cpp 
extern const System SystemB = {"B", 1, 2 ...}; //In B.cpp 

Или вы могли бы сделать заголовок, например, Globals.h, объявить их:

extern const System SystemA; 
extern const System SystemB; 

Таким образом, это гарантирует, что они будут иметь такую ​​же связь между всеми единицами компиляции, которые включают в себя заголовок. Позже, вы можете определить их без extern ключевого слова, так как extern декларация уже видна:

a.cpp

#include "Globals.h" 

const System SystemA = {"A", 1, 2 ...}; 

B.cpp

#include "Globals.h" 

const System SystemB = {"B", 1, 2 ...}; 
+0

О, миллион спасибо. Это действительно исправляет! Я, хотя все нестатические переменные, где externable по умолчанию. Думаю, я снова должен прочитать спецификацию. – DarkZeros

Смежные вопросы