[英]inline function linker error
我正在嘗試使用特定類的內聯成員函數。 例如,沒有內聯的函數聲明和實現是這樣的:
在頭文件中:
int GetTplLSize();
在.cpp文件中:
int NeedleUSsim::GetTplLSize()
{
return sampleDim[1];
}
出於某種原因,如果我將“inline”關鍵字放在實現和聲明中的任何一個中,以及兩個地方,我都會收到鏈接器錯誤,如下所示:
Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed.
為了擺脫這個錯誤需要做什么(即在制作這些內聯成員函數方面我做錯了什么)?
您需要將函數定義放入標題中。 提示編譯器內聯的最簡單方法是在類聲明中包含方法體,如:
class NeedleUSsim
{
// ...
int GetTplLSize() const { return sampleDim[1]; }
// ...
};
或者,如果你堅持單獨的聲明和定義:
class NeedleUSsim
{
// ...
int GetTplLSize() const;
// ...
};
inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
必須在使用該方法的每個翻譯單元中顯示該定義。
正如其他人已經指出的那樣,您需要將內聯函數的定義移動到頭文件中,如下所示:
class NeedleUSsim
{
// ...
inline int GetTplLSize() { return sampleDim[1]; }
// ...
};
這樣做的原因是編譯器在看到對內聯函數的調用時需要知道要內聯的代碼。 如果將函數的定義留在針對NeedleUSsim類的.cpp文件中,則編譯器為其生成的代碼將被捕獲在NeedleUSsim對象文件中。 由於編譯器只讀取源代碼 - 它永遠不會窺視另一個類的目標文件 - 它在編譯另一個.cpp文件時根本無法知道用什么代碼替換一個調用。
如果您有內聯函數,則應將定義放在頭文件中。
請參閱Inline Guard宏語成語 。 這將至少允許您將聲明中的代碼分開(盡管稍微)。 它還允許您通過define
來切換函數的內聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.