2011-03-26 60 views
3

大家好,我有这样的代码:宏卫不工作头

//a.h 
#ifndef SB 
#define SB 
namespace A{ int a = 10; int b = 10;} 
#endif 

但是,如果我进口的a.cpp文件啊,编译器会抱怨:

error LNK2005: "int A::a" ([email protected]@@3HA) already defined in a.obj 

它看起来像编译器将.h文件和.cpp文件结合在一起,没有显式的“导入”语句。但对于我来说,在宏观卫士定义的情况下会发生这种情况。

我使用Visual C++

回答

3

机会是你有一个循环#include语句有些地方是把头文件到这两个目标文件,然后尝试连接到目标文件一起得到重复的条目。

请记住,当#include编译器正在做的是剪切/粘贴.h文件的内容而不是include所在的行。

您将需要在.h文件中声明原型,而不是实际声明这些对象及其值。

11

#include警卫防止一个文件多次包含相同的.h文件。它们不会阻止每个包含相同.h文件的多个文件,这是我认为正在发生的事情。移动你定义成一个单一的.cpp文件,并留下只是一个声明这里:

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

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

+0

解决方案很好,但我认为这个问题最好由@James – 2011-07-27 19:13:29

+0

确定+1不仅解决方案出现在问题上,而且问题的原因很明显。 – 2011-09-08 19:17:28

0

如果你想A和B具有恒定的值,你可以这样做:

//a.h 
#ifndef SB 
#define SB 
    namespace A{const int a = 10; const int b = 10;} 
#endif 

,它不会是一个问题,包括它在几个地方。

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