我是菜鸟我是菜鸟……最近遇到一个常识性错误,关于内联函数的(error LNK2019 无法解析的外部符号)。
通常编写函数时,会把声明放到头文件(*.h)中,而把函数定义放在源文件(*.cpp)中,在其他源文件中使用时包含对应的头文件即可。
但是内联函数(inline)不要定义在cpp文件中,因为我们通常都是包含头文件,而编译器在编译时会对内联函数进行展开操作,但是编译器只能在包含的头文件里搜索函数的定义体,如果头文件只有声明,显然编译器不知道该如何展开,于是就出错了。
每一个使用内联函数的地方,都应该知道内联函数的定义,所以内联函数就直接定义在头文件中。
一个错误的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // Test.h #ifndef _TEST_H #define _TEST_H class CTest { public: /*inline */void FooBar(); //{ // printf("FooBar() called.\n"); //} }; #endif // Test.cpp #include "Test.h" #include <stdio.h> inline void CTest::FooBar() { printf("FooBar() called.\n"); } // Main.cpp #include <stdio.h> #include "Test.h" int main(int argc, char **argv) { CTest test; test.FooBar(); return 0; } |
Visual Studio会抱怨:Main.obj : error LNK2019: 无法解析的外部符号 “public: void __thiscall CTest::FooBar(void)” (?FooBar@CTest@@QAEXXZ),该符号在函数 _main 中被引用
不过,既然内联函数在编译器就要展开,那为何在链接时才报错呢?这一点不是很明白,微软MSDN是这么说的:
同样,如果项目使用函数内联,但在 .cpp 文件(而非头文件)中定义函数,也会得到 LNK2019。 头文件包含在任何被认为合适的位置,但只有在 .cpp 文件通过编译器时函数才内联; 因此当函数用于其他模块时,链接器将函数看成无法解析的外部对象。
引用自:函数内联问题
本博客很少转载他人文章,如未特别标明,均为原创,转载请注明出处:
本文出自程序人生 >> error LNK2019 无法解析的外部符号
作者:代码疯子