C++ 在头中声明公共变量会导致链接器错误
我在一个名为“external.h”的文件中有一个变量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
此头文件中有头保护,因此变量不会被多次定义。其他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";