2012-06-17 2 views
14

У меня есть 4 файла (2 заголовка и 2 файла кода). FileA.cpp, FileA.h, FileB.cpp, FileB.hC++ несколько определений переменной

FileA.cpp:

#include "FileA.h" 

int main() 
{ 
    hello(); 
    return 0; 
} 

void hello() 
{ 
    //code here 
} 

FileA.h:

#ifndef FILEA_H_ 
#define FILEA_H_ 
#include "FileB.h" 
void hello(); 

#endif /* FILEA_H_ */ 

FileB.cpp:

#include "FileB.h" 

void world() 
{ 
    //more code; 
} 

FileB.h:

#ifndef FILEB_H_ 
#define FILEB_H_ 

int wat; 
void world(); 


#endif /* FILEB_H_ */ 

Когда я пытаюсь скомпилировать (с затмением), я получаю «множественное определение« wat » И я не знаю, почему, похоже, все должно работать нормально.

+4

Добро пожаловать в мир ссылок .. –

ответ

22

Я не буду включать в себя все детали, но определить глобальную переменную, wat дважды в вашей компиляции UINT.

Чтобы исправить, используйте следующее:

FileB.h

extern int wat; 

FileB.cpp

int wat = 0; 

Это (extern) говорит, что декомпилировать переменная wat существует где-то, и что ему нужно найти его на своем собственном (в данном случае, это в FileB.cpp)

+0

Это влияет на оптимизацию переменных 'const'? Оптимизация компилятора выполняется на этапе компиляции или стадии ссылки? – ar2015

0

Это объявление переменной wat является определением, которое должно принадлежать в файле cpp. Это как если бы вы поместили свои тела функций в заголовок.

Вам нужно поставить extern перед декларацией wat и скопировать текущую декларацию без использования extern в один из файлов cpp.

3

Вы получаете несколько определений, потому что wat объявляется в области файлов и дважды отображается в двух исходных файлах.

Вместо этого сделайте переменную declartion extern и определите ее точно в один файл.

extern int wat; // In FileB.h 

int wat; // In FileB.cpp 
1

Я нашел ответ сейчас (я думаю, глядя на файлы один за другим помогли) Проблема в том, что компилятор создает a FileB.o, который имеет определение wat, , а затем пытается скомпилировать FilB.o с FileA.cpp, в то время как FileA.h включает в себя FileB.h, теперь у него также будет определение wat.

+0

У меня только один файл blabla.h и с включенными защитами (#ifndef xxx_H ...) и одна глобальная переменная. Во время компиляции я получил множественное определение ошибки «myglobal_variable». –

6

Не объявляйте переменную в заголовке. #include буквально копирует и вставляет содержимое файла в другой файл (то есть любой файл, который делает #include "FileB.h", буквально копирует содержимое файла FileB.h, что означает, что int wat определяется в каждом файле, который делает #include "FileB.h").

Если вы хотите получить доступ к wat из FileA.cpp, и он объявлен в FileB.cpp, вы можете пометить его как extern в FileA.cpp.

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