C++ 在头中声明公共变量会导致链接器错误

C++ 在头中声明公共变量会导致链接器错误,c++,C++,我在一个名为“external.h”的文件中有一个变量 此头文件中有头保护,因此变量不会被多次定义。其他cpp文件可以使用该变量。 这就是它看起来的样子 文件:External.h #ifndef EXTERNAL_COMN_GUARD #define EXTERNAL_COMN_GUARD char* rst = "SomeString"; #endif 现在,当我尝试构建我的项目时,由于以下原因,我得到了以下链接器错误: 1>contact.obj : error LNK2

我在一个名为“external.h”的文件中有一个变量


此头文件中有头保护,因此变量不会被多次定义。其他cpp文件可以使用该变量。 这就是它看起来的样子

文件:External.h

#ifndef EXTERNAL_COMN_GUARD
#define EXTERNAL_COMN_GUARD
    char* rst = "SomeString";
#endif 
现在,当我尝试构建我的项目时,由于以下原因,我得到了以下链接器错误:

1>contact.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
1>moc_houses.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
1>moc_messages.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
1>huts_messages.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
1>main_messages.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
1>host.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
1>main.obj : error LNK2005: "char * rst" (?rst@@3PADA) already defined in peopleWidget.obj
我通过这样做解决了这个问题

常量字符rst[]=“某物”

我想知道为什么这样做有效,而不是
std::string rst=“something”

声明并定义具有全局链接可见性的变量
rst
。每次包含External.h时,都会得到另一个
rst
的定义。当使用链接应用程序时,链接器会发现多个
rst
定义,并且不知道如何使用它们

如果要在多个源之间共享
rst
,请拆分其定义和声明,或将其声明为静态:

extern char* rst; // declaration in header
char* rst = "SomeString"; // definition in only one source file!


“此头文件中有头保护,因此变量不会被多次定义。”-是的。它在使用头的每个文件中定义。就像每个文件中都定义了它一样,每个人都犯了错误,并且发布了另一个缺乏研究的重复问题。
extern char* rst; // declaration in header
char* rst = "SomeString"; // definition in only one source file!
static char* rst = "SomeString";