我的 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 构建这个。
我怎样才能摆脱这个错误? 我所做的事情有什么问题?
尽管内联了该函数,我还是遇到了错误。真的很奇怪!
最佳答案
如果将自由函数定义保留在头文件中,则必须使用 inline
关键字进行定义:
inline bool CheckVal(int value) {
// ^^^^^^
return value == 1;
}
否则函数定义会出现在包含头文件的每个翻译单元中,并且链接器会看到它的多个定义。
正如我上面所做的那样,您不需要 if
/else
来重新调整 bool
值。
另一种解决方案是仅在 header 中声明函数
bool CheckVal(int value);
并将实现(定义)移至单独的翻译单元。
这至少有一个优点:如果您在实现中更改了某些内容,则不需要重新编译该 header 上的任何依赖翻译单元。
关于类外部函数定义的 C++ 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42769248/