У меня есть три файла в моем проекте.
a.c
b.c
test.h
test.h объявляет
namespace test_namespace {
int i;
void f1();
};
test.h также окружен
#ifndef __x
#define __x
...
#endif
Теперь a.c включает test.h, а b.c также включает test.h.
a.c имеет функцию main (), а b.c имеет реализацию test_namespace :: f1 ()
Однако при компиляции я получаю ошибку компоновки -
"test_namespace::i is already defined in <b.c's object file mapping in /tmp>"
Если я позаботился о том, чтобы включить директивы препроцессора условной компиляции в test.h, почему он включен в оба файла a.c и b.c?
Также следует отметить, что если я скомпилирую b.c отдельно в качестве разделяемой библиотеки, а затем использую ее в качестве разделяемой библиотеки при связывании объектного файла a.c, я не получу эту ошибку.
Может кто-нибудь объяснить мне вышеуказанную ошибку, особенно перед лицом директив условной компиляции?