宏保护在头文件中不起作用。

3

大家好,我有这样的代码:

//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

看起来编译器会在没有显式“import”语句的情况下将.h文件和.cpp文件组合在一起。但是对我来说,如果使用宏保护,则这种情况并不合理。

我使用Visual C++。

3个回答

11

#include保护宏可以防止一个文件重复包含同一个.h头文件,但是无法防止多个文件各自只包含同一份.h头文件,这可能是你的情况。将定义移到单独的.cpp文件中,这里只留下一个声明

namespace A {
    extern int a;
    extern int b;
}

这告诉编译器这些变量在某个地方存在,但是它们的定义可以在其他地方找到。


解决方案不错,但我认为问题被@James更好地识别了。 - Alan Turing
+1 不仅解决方案完美无瑕,而且问题的原因也被说明得非常清楚。 - Brian Vandenberg

3
很可能您在某个地方有一个循环的#include语句,它会将头文件放入两个目标文件中,然后尝试链接目标文件时会得到重复条目的错误。
请记住,当您使用#include时,编译器所做的是将.h文件的内容剪切/粘贴到#include所在行的位置。
您应该在.h文件中声明原型,而不是实际声明这些对象及其值。

0
如果您想让a和b具有恒定的值,可以这样做:
//a.h 
#ifndef SB
#define SB
    namespace A{const int a = 10; const int b = 10;}
#endif

如果您需要在多个地方包含它,这将不是问题。

如果您需要更改值,则应遵循dfan的建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接