关于命名空间变量的C++ VS2010链接器错误

use*_*390 0 c++ linker

MyNamespace.h:

namespace MyNamespace{
    int a
}
Run Code Online (Sandbox Code Playgroud)

MyNamespace.cpp:一些使用a的函数

main.cpp中

#include "MyNamespace.h"
Run Code Online (Sandbox Code Playgroud)
main.obj : error LNK2005: "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >
FileNamespace::m_rootDirectoryPath"
(?m_rootDirectoryPath@FileNamespace@@3V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)
already defined in FileNamespace.obj
1>main.obj : error LNK2005: "struct FileNamespace::FileTree FileNamespace::m_dataFileTree"
(?m_dataFileTree@FileNamespace@@3UFileTree@1@A) already defined in
FileNamespace.obj
Run Code Online (Sandbox Code Playgroud)

Mat*_*lia 6

您正在多个翻译单元中定义一个全局变量(带有外部链接),这会导致重复的定义错误(因为您违反了ODR).

你应该做的,相反,是为了宣布与它在头部extern声明

namespace MyNamespace{
    extern int a;
}
Run Code Online (Sandbox Code Playgroud)

并在单个 .cpp文件中定义它(可能在MyNamespace.cpp)

int MyNamespace::a;
Run Code Online (Sandbox Code Playgroud)

这样,编译器将在单个对象模块中仅创建此变量的一个实例,并且链接器将将在其他对象模块中对其进行的所有引用链接到此单个实例.

它可以帮助您理解问题,注意这与在头文件中声明函数(仅在原型中编写)并在单个文件中定义函数完全等效.cpp.