C++ 类外函数定义的链接器错误

C++ Linker error with a function definition outside class

本文关键字:链接 错误 定义 函数 C++      更新时间:2023-10-16

我的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值。


另一种解决方案是在标头中声明函数

bool CheckVal(int value);

并将实现(定义)移动到单独的翻译单元。
这至少有一个优点,即如果您在实现中更改某些内容,则不需要重新编译该标头上的任何依赖翻译单元。

我正在做的事情有什么问题?

一个定义规则要求(非内联)函数必须只定义一次

如果将标题包含在多个翻译单元中,则会有多个定义,因此违反了 odr。

如果函数有多个不同的定义,这也违反了 odr。

我怎样才能摆脱这个错误?

解决方案 1:不要在标头中定义函数。而是在源文件中定义它。源文件不包含在其他源文件中,因此使用此方法时应该只有一个定义。

解决方案 A:声明函数inline

在这两种情况下,请检查是否没有其他同名函数。


仅当函数使用 odr 时。这种微妙之处与这个问题无关。