//a.h
#ifndef SB
#define SB
namespace A{ int a = 10; int b = 10;}
#endif
但是,如果我在a.cpp文件中导入a.h,编译器会抱怨:
error LNK2005: "int A::a" (?a@A@@3HA) already defined in a.obj
看起来编译器会将.h文件和.cpp文件组合在一起而不使用显式的“import”语句。但是对我来说没有任何意义,因为定义了宏保护会发生这种情况。
我使用Visual C ++
答案 0 :(得分:11)
#include
防护可防止一个文件多次包含相同的.h文件。它们不会阻止每个文件包含相同的.h文件一次,这就是我假设发生在你身上的事情。将您的定义移动到单个.cpp文件中,并在此处只留下声明:
namespace A {
extern int a;
extern int b;
}
告诉编译器这些变量存在于某个地方,但它们的定义可以在其他地方找到。
答案 1 :(得分:3)
你可能有一个循环的#include语句,其中一些是将头文件放入两个目标文件中,然后尝试将目标文件链接在一起得到重复的条目。
请记住,当#include编译器正在做的事情时,剪切/粘贴.h文件的内容代替包含的行。
您需要在.h文件中声明原型,而不是这些对象及其值的实际声明。
答案 2 :(得分:0)
如果您希望a和b具有常量值,则可以执行以下操作:
//a.h
#ifndef SB
#define SB
namespace A{const int a = 10; const int b = 10;}
#endif
将它包含在几个地方不会有问题。
如果您需要更改值,请遵循dfan的建议。