C++ 多个定义,即使只给出了一个定义
C++ Multiple definitions even though only one definition is given
我正在尝试制作一个小的无序列图,可以用来永久存储键和值,作为一种字典。类型 TengwarChar
只是一个具有两个值的对象,一个字符串和一个枚举,稍后我也会添加方法。我使用的标题如下:
#ifndef TENGWARLIBRARY_H
#define TENGWARLIBRARY_H
#include "tengwarchar.h"
#include <unordered_map>
#include <algorithm>
#include <string>
typedef std::unordered_map<std::string, TengwarChar> CharMap;
extern const CharMap numbers = {
{"0", TengwarChar("ð", SHORT)},
{"1", TengwarChar("ñ", SHORT)},
{"2", TengwarChar("ò", SHORT)},
{"3", TengwarChar("ó", SHORT)},
{"4", TengwarChar("ô", SHORT)},
{"5", TengwarChar("õ", SHORT)},
{"6", TengwarChar("ö", SHORT)},
{"7", TengwarChar("÷", SHORT)},
{"8", TengwarChar("ø", SHORT)},
{"9", TengwarChar("ù", SHORT)}
};
std::string translateFromEnglishToTengwar(std::string str);
std::string translateFromTengwarToEnglish(std::string str);
#endif // TENGWARLIBRARY_H
然后,我有一个简单的测试cpp文件:
#include "tengwarlibrary.h"
std::string translateFromEnglishToTengwar(std::string str)
{
std::transform(str.begin(), str.end(), str.begin(), (int (*)(int))std::tolower);
return str;
}
std::string translateFromTengwarToEnglish(std::string str)
{
return "Hello world.";
}
问题是,当我在 main 函数中调用 translateFromTengwarToEnglish
时,我不断收到"数字的多重定义 [abi:cxx11]"错误,即使我相当确定我只在我的头文件中定义了一次,也使用标头保护。如果它可能会有所帮助,这是我不起眼的主 cpp 文件:
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include "utils/tengwarlibrary.h"
int main(int argc, char *argv[])
{
std::string s = "BlaH FElfeFEJI, IEORlfj";
std::cout<<translateFromEnglishToTengwar(s)<<std::endl;
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
根据C++标准 §3.1.2
声明是一个定义,除非它声明一个函数而不指定函数的主体,它包含 extern 说明符或链接规范,并且两者都不是 初始值设定项也不是函数体...
头文件中的numbers
声明tengwarlibrary.h
是带有初始值设定项的外部声明。所以这也是一个定义。
由于您已将tengwarlibrary.h
包含在两个源文件(一个定义了translateFromTengwarToEnglish()
和main()
定义了(中,因此它们都具有numbers
的定义。因此,错误。
要解决此问题,请在头文件中声明带有extern
的number
,并在单个源文件中对其进行初始化。
这似乎是最新版本的GCC的问题。就我而言,此错误是在 docker 容器上运行 C 项目(Alpine 图像(时出现的。但是,当我使用较旧的 GCC 版本 (9.4.0( 运行同一项目时,它没有出现。
为我修复它的方法是将 extern
关键字添加到提出问题的全局变量/函数中。
相关文章:
- 用C++中的一个变量定义一个常量
- 在类定义之后定义一个私有方法
- 如何定义一个纯抽象基类
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 如何在 c++ 中定义一个将被另一个短语替换的短语?
- 是否可以定义一个以向量<T>作为值的unordered_map?
- 我可以定义一个 constexpr 匿名/未命名变量吗?
- 定义一个 void f(void) 函数,但使用来自同一范围的变量?
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 在C++中,我想通过使用来自变量(例如字符串)的typename信息,从模板中定义一个类对象
- 为什么我必须显式定义一个由固有类提供的方法
- 定义一个带有缓冲区的函数作为卤化物中的边界框参数
- Visual Studio 2017 C++,如何定义一个"环境变量"'Additional Library Directory'?
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 仅使用 bool 和 char 定义一个 templete 类
- 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针
- 是否可以定义一个非模板函数,该函数可以将模板化对象作为参数
- 如何在C 中定义一个副操作员