С++ несколько определений переменной

У меня есть 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.