【发布时间】:2011-10-23 21:27:59
【问题描述】:
我的项目中有三个文件。
交流
b.c
测试.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 的目标文件时将其用作共享库,则不会出现此错误。
有人可以向我解释上述错误,特别是面对条件编译指令吗?
【问题讨论】:
-
您的条件头文件包含工作正常,但您的代码已损坏。全局变量只能定义一次。
-
条件编译指令(通常称为包含守卫)并不像您认为的那样做。它们防止头文件被两次包含在 same 源文件中,它们不会防止头文件被两次包含在 不同 源文件中。如果这就是他们的工作方式,那就太神奇了,我们不相信。
-
“事物”/以 2 个下划线或一个下划线和一个大写字母开头的标识符保留用于实现。请修改您的标头保护命名。像其他人一样把它改成
HEADERNAME_H,也许以PROJECTNAME_为前缀。
标签: c++ c header linker conditional