2010-03-30 54 views
3

當試圖在Visual C++(2008 express)中內聯函數時,我在仔細檢查代碼後發現鏈接錯誤,我發現的是函數I am試圖內聯拋出一個異常......如果我刪除異常拋出,鏈接錯誤消失,有人可以解釋爲什麼它是這種情況?嘗試內聯函數時在Visual C++中鏈接錯誤

int com_ximpleware::FastIntBuffer::intAt(int index){ 
    if (index < 0 || index > size - 1) { 
     throw InvalidArgumentException("invalid index range in FastIntBuffer's intAt()"); 
    } 
    return ((int *) al->get(index>>exp))[index & r]; 
} 

如下所示的exaxt錯誤:

intHash.obj : error LNK2019: unresolved external symbol "public: int __thiscall com_ximpleware::FastIntBuffer::intAt(int)" ([email protected]@[email protected]@[email protected]) referenced in function [email protected]@[email protected]@[email protected]$0 
1>C:\new_cvs\cpp_test1\Debug\cpp_test1.exe : fatal error LNK1120: 1 unresolved externals 

一兩件事,這個函數被調用別的正常,沒有被列入該函數的調用部分。

+0

當你將它嵌入時,是否將它移動到頭文件中? – 2010-03-30 02:58:20

+0

我把定義(即實現)在標題中,並沒有問題...我必須將其移動到標題以內聯它嗎?我以爲我可以聲明它是一個內聯函數,不是嗎? – 2010-03-30 03:21:44

+0

無論它在哪裏調用,它都必須是可見的,所以通常它必須位於頭文件中。 – Darryl 2010-03-30 03:33:48

回答

9

您必須將您的定義放在頭文件中。

內聯成員函數可以用兩種方式來定義:

  • 定義在類體內自身的成員函數。
  • 宣佈該成員函數就像類中的普通成員函數,但是當你定義內聯成員函數,前面加上成員函數的定義與關鍵字inline並且將定義成一個頭文件,如下所示:

class ClassA 
{ 
public: 
    void f(); 
}; 

inline void ClassA::f() 
{ 
} 

如果將內聯函數的定義放在.cpp文件,它如果是從其他.cpp文件調用,你會得到從鏈接的「無法解析的外部」錯誤(C++ FAQ Lite)。

我不認爲它與拋出的異常有關。即使不拋出異常,我也可以在Visual C++ 2005中複製此問題。

我的猜測是它試圖內聯函數,但找不到它的定義,因爲它在一個單獨的.cpp文件中。編譯器可能做了一些特殊處理,因爲它在定義中識別了inline關鍵字。如果您刪除了inline關鍵字,則問題消失並且鏈接成功。因此,如果您希望將它定義爲內聯,則需要將定義與其聲明一起放在頭文件中。