符号是多重定义的

时间:2013-02-14 08:14:29

标签: c++

我有一个.h文件

test.h

std::list<std::string> RegisterList;

我想在2 .c文件中访问此列表

A.C

#include "test.h"

RegisterList.push_back(myString);

B.c

#include "test.h"

RegisterList.push_back(myString2);

当我编译这段代码时,我收到一个错误 ld:致命:符号`RegisteredList'是多重定义的:

可能是什么问题?是否在test.h中默认初始化了RegsiterList,导致出现此问题?

4 个答案:

答案 0 :(得分:10)

因为您在头文件中定义了对象并违反了一个定义规则。永远不要在头文件中定义对象。

如果要使用全局对象,则需要将其声明为extern,并在一个且只有一个源文件中定义它。

答案 1 :(得分:4)

您需要以下内容:

test.h

extern std::list<std::string> RegisterList;

A.C

#include "test.h"

RegisterList.push_back(myString);

B.c

#include "test.h"

std::list<std::string> RegisterList;

RegisterList.push_back(myString2);

答案 2 :(得分:3)

您的代码通过链:preprocessor - &gt; compiler - &gt; linker。您的问题源于预处理器,但在链接器之前不会显示。

#include是一个预处理器指令。

预处理器不是编译.cpp文件,而是从中合成另一个文件,粘贴在任何包含的文件中。

然后,编译器编译合成文件,生成一个包含数据定义的目标文件。

您将预处理器指向#include两个不同.cpp文件中的头文件,这会生成两个不同的目标文件,并定义相同的数据。

ld: fatal: symbol 'RegisteredList' is multiply-defined

此错误消息是链接器(ld)抱怨多次定义全局符号,并且它不知道使用哪一个。

答案 3 :(得分:2)

不要在头文件中实例化变量。始终在代码文件中实例化它,并参考头文件中的实例化。