我正在尝试使用特定类的内联成员函数。例如没有内联的函数声明和实现是这样的:
在头文件中:
int GetTplLSize();
在.cpp文件中:
int NeedleUSsim::GetTplLSize()
{
return sampleDim[1];
}
出于某种原因,如果我将“inline”关键字放在实现和声明之一以及这两个位置中,我会收到链接器错误,如下所示:
创建库 C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1 emplib.x 和对象 C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1 emplib.exp mexfunction.obj :错误 LNK2019:函数 _mexFunction 中引用的无法解析的外部符号“public: int __thiscall NeedleUSsim::GetTplLSize(void)” (?GetTplLSize@NeedleUSsim@@QAEHXZ) mexfunction.mexw32:致命错误 LNK1120:1 个未解析的外部 C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL:错误:“mexfunction.mexw32”的链接失败。
需要做什么才能消除此错误(即,我在制作这些内联成员函数方面做错了什么)?
然后您需要将函数定义放入标题中。提示编译器内联的最简单方法是在类声明中包含方法体,例如:
class NeedleUSsim
{
// ...
int GetTplLSize() const { return sampleDim[1]; }
// ...
};
或者,如果您坚持单独声明和定义:
class NeedleUSsim
{
// ...
int GetTplLSize() const;
// ...
};
inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
定义必须在使用该方法的每个翻译单元中可见。
来自 C++ FAQ Lite
如果你把内联函数的 定义到 .cpp 文件中,如果它 从其他一些 .cpp 文件调用, 你会得到一个“未解决的外部” 来自链接器的错误。
正如其他人已经指出的那样,您需要将内联函数的定义移动到头文件中,如下所示:
class NeedleUSsim
{
// ...
inline int GetTplLSize() { return sampleDim[1]; }
// ...
};
这样做的原因是,当编译器看到对内联函数的调用时,需要知道要内联哪些代码。如果将函数的定义保留在 NeedleUSsim 类的 .cpp 文件中,则编译器为其生成的代码将被捕获在 NeedleUSsim 对象文件中。由于编译器仅读取源代码(它从不查看另一个类的目标文件),因此在编译另一个 .cpp 文件时,它根本无法知道用什么代码来替换调用。
如果你有内联函数,你应该将定义放在头文件中。
请参阅内联防护宏习惯用法。这至少允许您将代码与声明分开,尽管稍微分开。它还允许您通过
define
切换函数内联。
当您在头文件中声明函数并将其定义为内联函数时,函数定义需要对所有使用该函数的翻译单元可见。换句话说,内联函数需要在包含头文件的每个翻译单元中定义。
如果要将成员函数保留为内联函数,请确保在使用它们的翻译单元中定义并正确链接它们。或者,您可以将函数定义从 .cpp 文件移动到头文件本身,这将使它们对包含头文件的所有翻译单元可见。