为什么删除const会给我链接器错误?

Joe*_*Joe 1 c++ linker const

我有一个全局变量:

const std::string whiteSpaceBeforeLeadingCmntOption = "WhiteSpaceBeforeLeadingComment";
Run Code Online (Sandbox Code Playgroud)

当我删除此变量声明中的const时,出现以下链接器错误:

error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > whiteSpaceBeforeLeadingCmntOption" (?whiteSpaceBeforeLeadingCmntOption@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) already defined in REGISTER_TO_UNSRLZ.obj
Run Code Online (Sandbox Code Playgroud)

这是一个.h文件,包含在各个地方,但我有一个#ifndef带,以避免将它包含在几个地方.任何想法错误是什么?

Mic*_*ael 5

当你在.h中使用const时,这是有效的,因为const意味着静态,所以你可以在多个compilands中拥有相同的变量.

通过删除.h文件中定义的变量的const,您将在同一程序中创建具有相同标识符的多个实例.

如果你需要删除.h,你可以这样做:

extern std::string whiteSpaceBeforeLeadingCmntOption;
Run Code Online (Sandbox Code Playgroud)

然后有:

std::string whiteSpaceBeforeLeadingCmntOption = "";
Run Code Online (Sandbox Code Playgroud)

在你的一个.cpp文件中.


Not*_*ure 5

问题是,通过在头文件中定义它,它将在包含该头文件的每个编译单元中实例化,从而导致它为链接阶段进行多次定义.

你想要做的是在.h中声明:

extern std::string whiteSpaceBeforeLeadingCmntOption;
Run Code Online (Sandbox Code Playgroud)

然后在单个 cpp中声明:

std::string whiteSpaceBeforeLeadingCmntOption = "WhiteSpaceBeforeLeadingComment";
Run Code Online (Sandbox Code Playgroud)