2014-01-14 34 views
2

今晚在一个项目上工作时,我挣扎了一段时间,抱怨一个“重复符号”的链接器错误。来自clang/llvm编译器的重复符号错误

我最终发现我有一个定义的帮助函数,而不是在我的头文件中声明,这是问题的根源(在一个小时内失去了它)。

为什么我可以像这样在我的头文件中定义内联函数;

int get_val const {return r;} 

但类外部的相同定义会引发链接器错误?

+0

我们不是都花了无数个小时追鬼...... – vonbrand

回答

3

类内成员函数定义被隐式标记为inline,而非成员函数定义不是,因此,如果您的定义位于头文件中,则只要多个翻译单元包含,就会中断one-definition-rule(ODR)你的标题。 inline提供了解决这个问题的方法。

所以,你需要明确地标记你的非成员函数为inline

inline int foo() {return 42;} 

或者,仅在头声明,并在.cpp文件中定义它。

请参阅this related post on inline functions

0

如果你需要一个内联函数,你应该在头文件中定义它。你可以看到C++ Primer(第4版),它有一些关于内联函数的页面。我想你可以在那里得到你的答案。