宏守卫在标题中不起作用

时间:2011-03-26 00:53:46

标签: c++

嘿大家,我得到的代码是这样的:

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

3 个答案:

答案 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的建议。