我正在尝试使用特定类的内联成员函数.例如,没有内联的函数声明和实现是这样的:
在头文件中:
int GetTplLSize();
Run Code Online (Sandbox Code Playgroud)
在.cpp文件中:
int NeedleUSsim::GetTplLSize()
{
return sampleDim[1];
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,如果我将"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.
为了摆脱这个错误需要做什么(即在制作这些内联成员函数方面我做错了什么)?
我有一些编译器/链接器错误,我不知道什么是正确的方法来继续.我遇到这种情况:
现在,如果我在ah和bh中声明foo1和foo2作为extern inline void我得到以下错误:
prj/src/bo:在函数
foo1': (.text+0x0): multiple definition offoo1'prj/src/main.o :(.text + 0x0):首先在这里定义make:* [kernel]错误1
在我描述的情况下,允许编译和链接而没有错误/警告的方式是什么?
来自 C18 标准:
如果翻译单元中函数的所有文件范围声明都包含不带 extern 的内联函数说明符,则该翻译单元中的定义是内联定义。
然后我们读到:
带有外部链接的内联函数的声明可以导致外部定义或仅在翻译单元内可用的定义。带有 extern 的文件范围声明会创建一个外部定义。
我已经编写了一些代码来检查该函数是否实际上是内联的。我已经使用此限制来找出:
具有外部链接的函数的内联定义不应包含具有静态或线程存储持续时间的可修改对象的定义,并且不应包含对具有内部链接的标识符的引用。
这是代码:
static int n = 5;
void inline foo() { n = 66; }
void inline foo(); // remove 'inline' in second version
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译时,我收到一条警告,说内联函数正在使用静态对象,这意味着实际上foo()是内联函数,因此它提供了内联(而非外部)定义。但是,当我inline从指示的行中删除说明符时,我不再收到警告。根据标准,它不是内联定义,所以我猜它提供了外部定义。
标准没有说,或者至少我看不到,是提供外部定义的内联函数是否不再是内联函数。根据我的测试,它确实不再是内联函数。
如果我的结论是正确的(我不知道),那么就会出现另一个问题:为什么 extern 内联函数是无用的东西?