我在名为“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
我通过
解决了这个问题const char rst [] =“Something”;
我想知道为什么会这样,而不是std::string rst = "something"
答案 0 :(得分:4)
char* rst = "SomeString";
使用全局链接可见性声明定义变量rst
。每次包含 External.h 时,您都会获得rst
的另一个定义。当链接应用程序到来时,链接器会发现多个rst
定义,并且不知道如何使用它们。
如果您希望在多个来源之间共享rst
,请将其拆分为定义和声明,或将其声明为静态:
extern char* rst; // declaration in header
char* rst = "SomeString"; // definition in only one source file!
或
static char* rst = "SomeString";