C++ 多个定义,即使只给出一个定义

And*_*lis 0 c++ compiler-errors multiple-definition-error

我正在尝试制作一个小的无序映射,我可以用它来永久存储键和值,作为一种字典。该类型TengwarChar只是一个具有两个值的对象,一个字符串和一个枚举,稍后我也会添加方法。我使用的标题如下:

\n\n
#ifndef TENGWARLIBRARY_H\n#define TENGWARLIBRARY_H\n\n#include "tengwarchar.h"\n#include <unordered_map>\n#include <algorithm>\n#include <string>\n\ntypedef std::unordered_map<std::string, TengwarChar> CharMap;\n\nextern const CharMap numbers = {\n    {"0", TengwarChar("\xc3\xb0", SHORT)},\n    {"1", TengwarChar("\xc3\xb1", SHORT)},\n    {"2", TengwarChar("\xc3\xb2", SHORT)},\n    {"3", TengwarChar("\xc3\xb3", SHORT)},\n    {"4", TengwarChar("\xc3\xb4", SHORT)},\n    {"5", TengwarChar("\xc3\xb5", SHORT)},\n    {"6", TengwarChar("\xc3\xb6", SHORT)},\n    {"7", TengwarChar("\xc3\xb7", SHORT)},\n    {"8", TengwarChar("\xc3\xb8", SHORT)},\n    {"9", TengwarChar("\xc3\xb9", SHORT)}\n };\n\nstd::string translateFromEnglishToTengwar(std::string str);\nstd::string translateFromTengwarToEnglish(std::string str);\n\n#endif // TENGWARLIBRARY_H\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,我有一个简单的测试 cpp 文件:

\n\n
#include "tengwarlibrary.h"\n\nstd::string translateFromEnglishToTengwar(std::string str)\n{\n    std::transform(str.begin(), str.end(), str.begin(), (int (*)(int))std::tolower);\n    return str;\n}\n\nstd::string translateFromTengwarToEnglish(std::string str)\n{\n    return "Hello world.";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是,当在我的主函数中调用时,我不断收到“数字的多重定义[abi:cxx11]”错误translateFromTengwarToEnglish,即使我相当确定我只在头文件中使用它定义了一次头球后卫也。如果它可能有帮助,这是我简陋的主 cpp 文件:

\n\n
#include "mainwindow.h"\n#include <QApplication>\n\n#include <iostream>\n\n#include "utils/tengwarlibrary.h"\n\nint main(int argc, char *argv[])\n{\n\n    std::string s = "BlaH FElfeFEJI, IEORlfj";\n    std::cout<<translateFromEnglishToTengwar(s)<<std::endl;\n\n    QApplication a(argc, argv);\n    MainWindow w;\n    w.show();\n\n    return a.exec();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

arm*_*007 5

根据C++标准\xc2\xa73.1.2

\n\n
\n

声明是一个定义,除非它声明一个函数而不指定函数\xe2\x80\x99s 主体,它包含 extern 说明符或链接规范,既不包含初始化程序也不包含函数主体...

\n
\n\n

numbers头文件中的声明tengwarlibrary.h是带有初始值设定项的外部声明。所以它也是一个定义。

\n\n

由于您已包含tengwarlibrary.h在两个源文件中(一个translateFromTengwarToEnglish()是定义的,一个是main()定义的),它们都具有numbers. 因此,出现错误。

\n\n

为了解决这个问题,在头文件中声明numberextern在单个源文件中初始化它。

\n