Если я объявляю глобальную переменную в заголовочном файле и включаю ее в два файла .cpp, компоновщик выдает ошибку, говоря, что символ определен многократно.
Мой вопрос: почему это происходит только для определенных типов объектов (например, int), а не для других (например, enum)?
Код теста, который я использовал, приведен ниже:
test.h
#ifndef TEST_HEADER
#define TEST_HEADER
namespace test
{
int i_Test1 = -1;
int i_Test2 = -1;
};
#endif // TEST_HEADER
Class1.h
#ifndef CLASS_1_HEADER
#define CLASS_1_HEADER
class class1
{
public:
void count();
};
#endif //CLASS_1_HEADER
class1.cpp
#include <iostream>
#include "class1.h"
#include "test.h"
void class1::count()
{
std::cout << test::i_Test1 << std::endl;
}
class2.h
#ifndef CLASS_2_HEADER
#define CLASS_2_HEADER
class class2
{
public:
void count();
};
#endif //CLASS_2_HEADER
class2.cpp
#include "class2.h"
#include <iostream>
#include "test.h"
void class2::count()
{
std::cout << test::i_Test2 << std::endl;
}
main.cpp
#include "class1.h"
#include "class2.h"
int main(int argc, char** argv)
{
class1 c1;
class2 c2;
c1.count();
c2.count();
return -1;
}
Создание этого кода с помощью:
g++ main.cpp class1.cpp class2.cpp -o a
производит следующий вывод:
ld: fatal: symbol test::i_Test1' is
multiply-defined:
(file /var/tmp//ccwWLyrM.o type=OBJT; file /var/tmp//ccOemftz.o
type=OBJT); ld: fatal: symbol
test :: i_Test2 'имеет несколько значений:
(файл /var/tmp//ccwWLyrM.o type = OBJT; файл /var/tmp//ccOemftz.o
тип = OBJT); ld: fatal: Обработка файлов
ошибки. Нет вывода, записанного в
collect2: ld вернул 1 статус выхода
Если я изменю файл test.h, как указано ниже:
test.h (с перечислением)
#ifndef TEST_HEADER
#define TEST_HEADER
namespace test
{
enum val
{
i_Test1 = 5,
i_Test2
};
//int i_Test1 = -1;
//int i_Test2 = -1;
};
#endif // TEST_HEADER
Я не получаю ошибку "множественное определение", и программа выдает желаемый результат:
5
6