inline怎么用?

纹枰老妖 2016-07-14 09:59:41
我写了一个很简单的小程序,有三个文件,分别是 String.h、 String.cpp和含有main函数的源文件,它们的内容分别是:
class String{
public :
inline String();
char* _s;
};


#include "String.h"

inline String::String()
{
_s = 0;
}


#include "String.h"

int main()
{
String s1;
}


可是这段代码无法通过编译,报错如下:
如果我把String.h和String.cpp中的inline关键词去掉,程序就正常,所以想求教热心朋友,为什么加上inline无法通过编译啊?
...全文
226 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 2016-07-15
  • 打赏
  • 举报
回复
inline是加在实现上,就算加在声明上,编译器也会忽略掉。内联展开是在编译时进行的,只有链接的时候源文件之间才有关系。所以内联要想跨源文件必须把实现写在头文件里。如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。
注意:将函数的定义({…}之间的部分)放在头文件中是强制的,除非该函数仅仅被单个 .cpp 文件使用。尤其是,如果你将内联函数的定义放在 .cpp 文件中并且在其他 .cpp文件中调用它,连接器将给出 “unresolved external” 错误。
最佳实践是:仅把inline关键字放在类外部函数的定义前。
inline函数的特征是在调用的地方插入相应函数的代码,所以编译之后的目标文件里是没有inline函数体的,因为在要调用的地方它都已经用相应的语句替换掉了(当然这只限于内联成功的情况)。如果我们将inline函数写在cpp文件里,但是绝大多数情况下,在我们用第三方类库的时候,我们只有头文件和目标文件(没有cpp文件),当你调用那个内联函数时,编译器没办法找到它。所以说将inline函数写在cpp文件中是没什么用的。
flying_music 2016-07-15
  • 打赏
  • 举报
回复
inline函数和普通的函数编译过程不一样,普通的函数编译时只是生成一个入口似的东西,然后在链接时换成对应函数的入口地址,也就是在编译时并不需要见到函数的定义,只知道有这么个东西就行了,也就是有声明就行 但inline函数要求编译器在调用处将代码展开,这就要求编译器必须知道inline函数的具体实现,否则没办法展开的,而C++程序是分离编译的,在编译main模块时,String.cpp中的内容是不知道的,所以就提示那个构造函数无法解析 使用时一般吧inline函数放到对应h文件而非cpp文件,还有模板函数也是如此,情况跟这个类似 另外inline只在定义时加,声明时不用加的,楼主要想彻底明白,最好百度一下inline函数编译连接的过程
纹枰老妖 2016-07-15
  • 打赏
  • 举报
回复
谢谢各位大侠的回复,小弟受教了,结贴。
dustpg 2016-07-14
  • 打赏
  • 举报
回复
inline需要保证编译调用这句的函数时,这段inline代码可见。 换句话说就是,在调用这句话前面实现这条函数,lz的这条函数 是实现在另一个源文件中,这是不行了(都不在同一个文件中,连前后都不存在)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧