inline 内联函数导致出现“无法解析的外部符号”问题原因

现象:我用VS2017编程,将类中的一些函数的实现写在了头文件里,运行成功后为优化代码阅读体验,想将函数定义放到对应的源文件中。右键点击函数名试了一下VS2017的功能,果然有“转移声明/定义位置”的选项,点击后自动将定义转移到了源文件内了。但是发现编译通不过了,报了熟悉且头疼的“无法解析的外部符号”错误。

检查后发现自动转移的定义处,自动加上了 inline,我把inline删掉后就能编译通过了。

原因:写了inline之后,编译器可能会进行函数内联,对函数进行直接展开,即用函数定义的内容替换掉函数名。对外表现为无法实现函数调用。故导出的不应该进行内联。

 

顺带一些内联函数的知识以及注意事项:

内联函数(inline)
内联函数的目的是为了减少函数调用时间。它是把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这里时候就不需要花时间去调用函数。但内联函数有个缺点是它会增加执行文件大小。所以如果不适当的使用内联函数会造成执行文件特别大。
而使用内联函数有以下几点需要注意:
头文件中不仅要包含inline函数的声明,还要包含inline函数的定义
编译器需要把inline函数体替换到函数调用处,所以编译器必须要知道inline函数的函数体是啥,所以要将inline函数的函数定义和函数声明一起写在头文件中,便与编译器查找替换。
可以在同一个项目的不同源文件内定义函数名相同,实现相同的inline函数
同一个inline函数可以多处声明和定义,但是必须要完全相同
定义在class声明内的成员函数默认是inline函数
虚函数(virtual)
虚函数是为了实现多态特性的。虚函数的调用只有在程序运行的时候才能知道到底调用的是哪个函数,其是有有如下几点需要注意:
 类的构造函数不能是虚函数
构造函数是为了构造对象的,所以在调用构造函数时候必然知道是哪个对象调用了构造函数,所以构造函数不能为虚函数。
 类的静态成员函数是虚函数
类的静态成员函数是该类共用的,与该类的对象无关,静态函数里没有this指针,所以不能为虚函数。
虚函数不能定义为内联函数的原因
inline是在编译器将函数类容替换到函数调用处,是静态编译的。而虚函数是动态调用的,在编译器并不知道需要调用的是父类还是子类的虚函数,所以不能够inline声明展开,所以编译器会忽略
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值