为了账号安全,请及时绑定邮箱和手机立即绑定

为什么标头中包含C ++内联函数?

为什么标头中包含C ++内联函数?

C++
动漫人物 2019-10-15 09:36:50
注意:这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么要按原样完成它们。类成员函数的声明不需要将函数定义为inline,而只是函数的实际实现。例如,在头文件中:struct foo{    void bar(); // no need to define this as inline}那么,为什么一类功能的内嵌实施有是在头文件?为什么不能将内联函数放在.cpp文件中?如果我尝试将内联定义放入.cpp文件中,则会出现以下错误:error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)"(?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

有两种查看方式:

  1. 内联函数在标头中定义,因为为了内联函数调用,编译器必须能够看到函数主体。为了使天真的编译器做到这一点,函数主体必须与调用位于同一转换单元中。(现代的编译器可以跨翻译单元进行优化,因此即使函数定义位于单独的翻译单元中,也可以内联函数调用,但是这些优化是昂贵的,并不总是启用的,并且也不一定总是受支持。编译器)

  2. 必须标记标inline头中定义的函数,因为否则,包含标头的每个翻译单元将包含该函数的定义,并且链接程序将抱怨多个定义(违反“一个定义规则”)。的inline关键字抑制此,允许多个翻译单元包含(相同)的定义。

这两种解释确实可以归结为以下事实:inline关键字不能完全满足您的期望。

C ++编译器可以随时随地应用内联优化(将函数调用替换为被调用函数的主体,以节省调用开销),只要它不会改变程序的可观察行为即可。

inline关键字使得它更容易让编译器应用此优化,通过允许函数定义在多个翻译单元是可见的,但使用关键字并不意味着编译器内联函数,而不是使用关键字不禁止编译器内联函数。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 446 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信