2014-01-14 54 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版),它有一些關於內聯函數的頁面。我想你可以在那裏得到你的答案。