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

时间:2013-12-09 06:18:31

标签: c++

我在名为“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"

1 个答案:

答案 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";