繁体   English   中英

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

[英]C++ Linker error with a function definition outside class

我的C ++代码如此奇怪的错误。

我想用一些方法维护头文件。 让我们称之为Util.hpp 我有下面的简单方法。

bool CheckVal(int value) {

  if (value == 1)
    return true;
  else
    return false;    
}

我在另一个类的cpp中包含Util.hpp并调用该方法。 我最后出现一个链接器错误提示

:-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

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


仅当该功能被使用时。 这种微妙之处与这个问题无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM