С++ несколько определений переменной
У меня есть 4 файла (2 заголовка и 2 файла кода).
FileA.cpp, FileA.h, FileB.cpp, FileB.h
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_ */
когда я пытаюсь скомпилировать (с eclipse), я получаю "множественное определение" wat "
И я не знаю, почему, похоже, все должно работать нормально.
Ответы
Ответ 1
Я не буду включать все детали, но вы определяете глобальную переменную wat
дважды в своей компиляции uint.
Чтобы исправить, используйте следующее:
FileB.h
extern int wat;
FileB.cpp
int wat = 0;
Это (extern
) сообщает компиляции, что переменная wat
существует где-то и что она должна найти ее на своем собственном (в этом случае она находится в FileB.cpp
)
Ответ 2
Не объявляйте переменную в заголовке. #include
буквально копирует и вставляет содержимое файла в другой файл (то есть любой файл, который делает #include "FileB.h"
, буквально копирует содержимое FileB.h в него, что означает, что int wat
определяется в каждом файле, который #include "FileB.h"
).
Если вы хотите получить доступ к wat
из FileA.cpp и объявлен в FileB.cpp, вы можете пометить его как extern
в FileA.cpp.
Ответ 3
Вы получаете несколько определений, потому что wat
объявляется в области файлов и дважды отображается в двух исходных файлах.
Вместо этого создайте переменную declartion extern
и определите ее в файле один.
extern int wat; // In FileB.h
int wat; // In FileB.cpp
Ответ 4
Я нашел ответ сейчас (думаю, смотря на файлы один за другим помогал)
Проблема в том, что компилятор создает FileB.o, который имеет определение wat,
а затем пытается скомпилировать FilB.o с FileA.cpp, в то время как FileA.h включает в себя файл FileB.h, теперь у него также будет определение wat.
Ответ 5
Это объявление переменной wat является определением, которое должно принадлежать в файле cpp. Это как если бы вы поместили свои тела функций в заголовок.
Вам нужно поставить extern перед объявлением wat и скопировать текущее объявление без extern в один из файлов cpp.