函数内联问题
如果使用内联函数,则必须:
在包含的头文件中实现函数。
在头文件中打开了内联。
// LNK2019_function_inline.cpp
// compile with: /c
// post-build command: lib LNK2019_function_inline.obj
#include <stdio.h>
struct _load_config_used {
void Test();
void Test2() { printf("in Test2\n"); }
};
void _load_config_used::Test() { printf("in Test\n"); }
然后,
// LNK2019_function_inline_2.cpp
// compile with: LNK2019_function_inline.lib
struct _load_config_used {
void Test();
void Test2();
};
int main() {
_load_config_used x;
x.Test();
x.Test2(); // LNK2019
}
如果使用 #pragma inline_depth
编译器指令,请确保设置的值为 2 或更大。 如果值为零,则将关闭内联。 此外,请确保使用的是 /Ob1 或 /Ob2 编译器选项。
在不同模块上混合内联和非内联编译选项有时会导致问题。 如果创建 C++ 库时启用了函数内联(/Ob1 或 /Ob2),但描述函数的相应头文件已关闭内联(无选项),将收到错误 LNK2001。 函数不会从头文件中内联到代码中,但由于它们不在库文件中,因此没有用于解析引用的地址。
同样,使用函数内联但在 .cpp 文件而不是头文件中定义函数的项目也会获得 LNK2019。 所有适当的位置都会包括头文件,但仅当 .cpp 文件通过编译器时才会内联函数;因此,在其他模块中使用时,链接器将函数视为未解析的外部函数。
// LNK2019_FIP.h
struct testclass {
void PublicStatMemFunc1(void);
};
然后,
// LNK2019_FIP.cpp
// compile with: /c
#include "LNK2019_FIP.h"
inline void testclass::PublicStatMemFunc1(void) {}
然后,
// LNK2019_FIP_2.cpp
// compile with: LNK2019_FIP.cpp
// LNK2019 expected
#include "LNK2019_FIP.h"
int main() {
testclass testclsObject;
// module cannot see the implementation of PublicStatMemFunc1
testclsObject.PublicStatMemFunc1();
}