Если я объявляю глобальную переменную в файле заголовка и включаю ее в два .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: фатальный: символ
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; file /var/tmp//ccOemftz.o type = OBJT); ld: fatal: Обработка файлов ошибок. Нет сигнала на выходе записывается в collect2: л.д. не возвращается 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
I не получайте «многократно определенную» ошибку, и программа выдаст желаемый результат:
5
6