C++ 宏保护不';割台不工作

C++ 宏保护不';割台不工作,c++,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”语句。但对于我来说,在定义了宏保护的情况下发生这种情况是

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

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

很可能您有一个循环的#include语句,其中一些语句将头文件放入两个目标文件中,然后尝试将目标文件链接在一起,从而获得重复的条目

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

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

#include
防护措施防止一个文件多次包含同一个.h文件。它们不会阻止多个文件一次包含同一个.h文件,这就是我假设发生在您身上的情况。将定义移动到单个.cpp文件中,并在此处留下声明:


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

如果希望a和b具有常量值,可以执行以下操作:

//a.h 
#ifndef SB
#define SB
    namespace A{const int a = 10; const int b = 10;}
#endif
把它包括在几个地方也不是问题


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

解决方案是好的,但我认为@James+1可以更好地识别问题,不仅解决方案正确,而且问题的原因也非常清楚。
//a.h 
#ifndef SB
#define SB
    namespace A{const int a = 10; const int b = 10;}
#endif