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

标签 c++

我的 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/

相关文章:

c++ - 使用模板通过 void 指针调用析构函数

c++ - 如何将 C++ 命名空间分解为多个文件

c++ - C++中使用命名空间的关键字

c++ - 遍历 boost::multi_array View

c++ - 计算 vector 中的出现次数

c++ - 比较 vector 中的元素并返回对象的最佳方法

c++ - Visual Studio 链接错误 LNK2005 和 LNK2020

c++ - 当 vector 超出范围时防止数据被释放

c++ - 我是否需要保护一个由一个线程写入并由多个线程读取的变量?

c++ - Cmake 仅包含 header 目标来自仅 header 目标