6

我有一个 .h 文件

测试.h

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

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

交流电

#include "test.h"

RegisterList.push_back(myString);

公元前

#include "test.h"

RegisterList.push_back(myString2);

当我编译这段代码时,我得到一个错误 ld: fatal: symbol `RegisteredList' is multiply-defined:

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

4

4 回答 4

12

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

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

于 2013-02-14T08:15:56.797 回答
3

你需要类似的东西:

测试.h

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

交流电

#include "test.h"

RegisterList.push_back(myString);

公元前

#include "test.h"

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

RegisterList.push_back(myString2);
于 2013-02-14T08:17:53.023 回答
3

您的代码通过一个链:preprocessor-> compiler-> linker。您的问题源于预处理器,但直到链接器才会出现。

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

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

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

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

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

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

于 2013-02-14T08:52:50.123 回答
2

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

于 2013-02-14T08:15:42.857 回答