2013-10-27 63 views
1

我一直在使用MSVC的中斷,並依稀記得內聯類成員函數沒有問題。然而,當我使用inline關鍵字這樣:inline關鍵字導致鏈接器錯誤2019在Visual C++

//In header file 
class A { 
    public: 
     inline void funcA(void); 
}; 

//In cpp file 
void A::funcA(void) { 

} 

我得到一個LNK2019,解決的符號(即使功能完全匹配什麼錯誤說缺少)。我試過把頭和定義標記爲內聯,並且發生同樣的事情。在嘗試構建之後,我也刪除了inline關鍵字,並且錯誤一直存在,直到我清理解決方案,之後,所有內容都以非內聯方式生成。沒有人似乎有同樣的問題,當我谷歌的問題,這表明我錯過了一些明顯的事情......但它是什麼?

+0

funcA是否在另一個翻譯單元中使用,而不是它在其中定義的翻譯單元?如果是這樣,這就是導致錯誤的原因,因爲編譯器需要知道定義以便用函數體替換調用。您需要在每個翻譯單元中使用一個相同的定義,因此它應該放在標題中,而不是cpp文件中 –

回答

3

內聯函數應該始終在頭中定義。它不一定要在類定義中,但它應該在標題中。如果您沒有將它放在標題中,其他模塊(包括.h文件)將無法看到定義並將其嵌入...

有關您的信息,最新版本的Visual C++具有鏈接時間代碼Generation,允許編譯器在其他模塊(= cpp文件)中內聯函數,即使內聯函數是在其他.cpp文件中定義的。但是這是一個專有擴展,完成時不考慮inline關鍵字。便攜的方式是使用inline並將其放在標題中。

+0

爲了將來的參考,如果我有一個非常長的公共函數,我想內聯,因爲它只用了一次?我應該在頭文件中定義它,還是根本不內聯? – NmdMystery

+0

如果在定義它的類之外使用它,它必須位於標題中。 – 2013-10-27 21:19:57

+0

@NmdMystery儘管你可以把它放在類聲明之後,所以人們可以在沒有大的方法的情況下看到這個類。如果上面顯示的所有代碼都在標題中,則表示沒問題。 – ssube

1

只要您將內聯成員公開或保護起來,就應該將定義放在標題中。如果僅在源中使用,則免除是私有內聯(沒有任何朋友訪問)。 (乾淨可能需要修復預編譯頭文件)