C++ 多个定义,即使只给出一个定义
C++ Multiple definitions even though only one definition is given
我正在尝试制作一个小的无序地图,我可以用它来永久存储键和值,作为一种字典。 TengwarChar
类型只是一个具有两个值的 object,一个字符串和一个枚举,稍后我也会添加方法。我使用的header如下:
#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.";
}
问题是,在我的主函数中调用 translateFromTengwarToEnglish
时,我不断收到 'multiple definition of numbers[abi:cxx11]' 错误,尽管我相当确定我只在我的 [=22] 中定义了一次=] 文件,也使用 header 守卫。如果它可能有帮助,这是我不起眼的主要 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++ standard§3.1.2
A declaration is a definition unless it declares a function without specifying the function’s body, it contains the extern specifier or a linkage-specification and neither an
initializer nor a function-body ...
头文件中numbers
的声明tengwarlibrary.h
是带有初始值设定项的外部声明。所以也是一个定义。
因为您在两个源文件中包含了 tengwarlibrary.h
(其中一个定义了 translateFromTengwarToEnglish()
并且定义了 main()
)它们都具有 numbers
的定义。因此,错误。
要解决此问题,请在头文件中用 extern
声明 number
并在单个源文件中对其进行初始化。
我正在尝试制作一个小的无序地图,我可以用它来永久存储键和值,作为一种字典。 TengwarChar
类型只是一个具有两个值的 object,一个字符串和一个枚举,稍后我也会添加方法。我使用的header如下:
#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.";
}
问题是,在我的主函数中调用 translateFromTengwarToEnglish
时,我不断收到 'multiple definition of numbers[abi:cxx11]' 错误,尽管我相当确定我只在我的 [=22] 中定义了一次=] 文件,也使用 header 守卫。如果它可能有帮助,这是我不起眼的主要 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++ standard§3.1.2
A declaration is a definition unless it declares a function without specifying the function’s body, it contains the extern specifier or a linkage-specification and neither an initializer nor a function-body ...
头文件中numbers
的声明tengwarlibrary.h
是带有初始值设定项的外部声明。所以也是一个定义。
因为您在两个源文件中包含了 tengwarlibrary.h
(其中一个定义了 translateFromTengwarToEnglish()
并且定义了 main()
)它们都具有 numbers
的定义。因此,错误。
要解决此问题,请在头文件中用 extern
声明 number
并在单个源文件中对其进行初始化。