类成员函数inline定义放单独文件为何引发链接符号缺失?
问题解答
这是因为C++对inline函数的定义可见性有明确规则:
inline函数的完整定义必须出现在每个调用它的源文件中。编译器处理inline函数调用时,需要直接看到函数体才能完成代码嵌入(而非生成对外部符号的引用)。- 当你把
inline int foo::bar()的定义放在foo.cpp里时,编译example.cpp的过程中,编译器只能看到foo.h里的函数声明,看不到inline的函数体,因此会将其当作普通非inline函数处理,生成对foo::bar()外部符号的引用。 - 而编译
foo.cpp时,由于函数被标记为inline,编译器不会为它生成全局可见的符号(inline函数默认拥有内部链接属性,除非显式声明extern inline)。到了链接阶段,example.cpp生成的符号引用找不到对应的定义,就会触发链接错误。
《C++ Primer》中的示例之所以可行,是因为书中的inline成员函数定义必然是放在头文件中的(或者每个调用该函数的源文件都能包含到这个定义),这样所有调用该函数的源文件在编译时都能看到完整的inline定义,编译器可以直接嵌入代码,不会生成外部符号引用,自然不会出现链接问题。
将inline定义移到foo.h后,example.cpp包含头文件时就能获取到完整的函数体,编译器直接把bar()的代码嵌入main函数中,不需要依赖外部符号,因此编译运行都正常。
内容的提问来源于stack exchange,提问作者luma
相关产品推荐
相关产品推荐

