我的C ++代码出现了这么奇怪的错误。
我想用一些方法维护一个头文件。让我们称之为Util.hpp
。我有以下简单的方法。
bool CheckVal(int value) {
if (value == 1)
return true;
else
return false;
}
我将Util.hpp
包含在另一个班级的cpp&调用方法。我最终得到一个链接器错误
:-1: error: 3 duplicate symbols for architecture x86_64
我在osx上用clang构建它。
如何摆脱此错误? 我正在做的事情出了什么问题?
尽管内联功能,我仍然遇到错误。真奇怪!
答案 0 :(得分:2)
如果您在头文件中保留自由函数定义,则必须使用inline
关键字:
inline bool CheckVal(int value) {
// ^^^^^^
return value == 1;
}
否则函数定义出现在包含头文件的每个翻译单元中,并且链接器会看到它的多个定义。
同样如上所述,您不需要if
/ else
来重新调整bool
值。
另一种解决方案是在标题
中声明该函数bool CheckVal(int value);
并将实施(定义)移至单独的翻译单元 这至少具有以下优点:如果您在实现中更改了某些内容,那么该标题上的任何dependend翻译单元都不需要重新编译。
答案 1 :(得分:1)
我在做什么是错的?
一个定义规则要求(非内联)函数必须恰好定义一次†。
如果您在多个翻译单元中包含标题,则会有多个定义,因此会违反odr。
如果函数有多个不同的定义,那也违反了odr。
如何摆脱这个错误?
解决方案1:不要在标题中定义函数。而是在源文件中定义它。源文件不包含在其他源文件中,因此在使用此方法时应该只有一个定义。
解决方案A:声明函数inline
。
在这两种情况下,请检查没有其他功能相同的名称。
†仅当函数使用了odr时。这个微妙之处与这个问题无关。