我有一个.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,导致出现此问题?
答案 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)
不要在头文件中实例化变量。始终在代码文件中实例化它,并参考头文件中的实例化。