有一个关于内联函数定义的问题需要求问下各位大神

weixin_42359982 2018-09-17 10:02:09
我在一个类里声明了多个内联;但是他们的函数定义我是放在cpp文件里定义的。结果只有一个内联函数报错了,。根据网上查的方法我把这个报错的内联函数放到.h文件里。然后就通过了。然后问题来了,为什么其他的内联函数在头文件外定义就没事呢?这是什么原理
...全文
491 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
林多 2018-09-17
  • 打赏
  • 举报
回复
引用 6 楼 weixin_42359982 的回复:
[quote=引用 5 楼 zxc024000 的回复:]
如果,内联函数在头文件中声明,在源文件中定义。当其他源文件中,引入声明内联的头文件,并使用该内联函数时。
一般,编译可以通过,但链接时会报,你贴图的那种错误(也就是找不到内联函数的定义)。

原因是:内联函数,其实并不算一种常规的函数(一段可重复使用,存在与虚拟地址中的代码区,当需要使用该函数时,可以去跳转到该空间,执行这段代码)。内联的话,可以理解为一段宏定义,将内联定义的代码,直接插入到调用的地方。

所以,对于内联函数,要么在头文件中声明,在每个使用它的源文件中重新定义。。要么,直接在头文件中定义,在其他源文件中直接使用。


这个道理我理解了,现在我想知道的是为什么有些内联声明和定义不在一个文件也能链接成功。难道这还是个概率问题,看脸?[/quote]


应该是不可能的。
1. 如果是指声明时,指定为inline,定义时未写inline,不算内联。
2. 就算指定为inline,是否具体使用inline,也是编译器自身决定的。
3. 或许,是你的代码中,写了什么,让调用内联的地方,能够看到内联的定义。只要调用的定义,能够有内联的定义,都是可以的。
weixin_42359982 2018-09-17
  • 打赏
  • 举报
回复
引用 5 楼 zxc024000 的回复:
如果,内联函数在头文件中声明,在源文件中定义。当其他源文件中,引入声明内联的头文件,并使用该内联函数时。
一般,编译可以通过,但链接时会报,你贴图的那种错误(也就是找不到内联函数的定义)。

原因是:内联函数,其实并不算一种常规的函数(一段可重复使用,存在与虚拟地址中的代码区,当需要使用该函数时,可以去跳转到该空间,执行这段代码)。内联的话,可以理解为一段宏定义,将内联定义的代码,直接插入到调用的地方。

所以,对于内联函数,要么在头文件中声明,在每个使用它的源文件中重新定义。。要么,直接在头文件中定义,在其他源文件中直接使用。


这个道理我理解了,现在我想知道的是为什么有些内联声明和定义不在一个文件也能链接成功。难道这还是个概率问题,看脸?
林多 2018-09-17
  • 打赏
  • 举报
回复
如果,内联函数在头文件中声明,在源文件中定义。当其他源文件中,引入声明内联的头文件,并使用该内联函数时。
一般,编译可以通过,但链接时会报,你贴图的那种错误(也就是找不到内联函数的定义)。

原因是:内联函数,其实并不算一种常规的函数(一段可重复使用,存在与虚拟地址中的代码区,当需要使用该函数时,可以去跳转到该空间,执行这段代码)。内联的话,可以理解为一段宏定义,将内联定义的代码,直接插入到调用的地方。

所以,对于内联函数,要么在头文件中声明,在每个使用它的源文件中重新定义。。要么,直接在头文件中定义,在其他源文件中直接使用。
weixin_42359982 2018-09-17
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
其它的内联函数没有在 main.cpp 当中使用到呗.

使用到了啊
www_adintr_com 2018-09-17
  • 打赏
  • 举报
回复
其它的内联函数没有在 main.cpp 当中使用到呗.
weixin_42359982 2018-09-17
  • 打赏
  • 举报
回复

引用 1 楼 kbasm 的回复:
什么错?代码?

无法解析的外部命令
这个函数是被声明为inline的,定义的话我把它放在了cpp文件里。就报这错了,而我放到类定义文件里时就可以了。
kbasm 2018-09-17
  • 打赏
  • 举报
回复
什么错?代码?
weixin_42359982 2018-09-17
  • 打赏
  • 举报
回复
引用 9 楼 kbasm 的回复:
[quote=引用 8 楼 weixin_42359982 的回复:]
我想可能是第二条吧,函数是不是用内联由编译器决定


具体原因是,内联函数定义需要出现在每个调用它的.cpp中。所以如果你的内联函数是
a.h
inline void aaa();

a.cpp
inline void aaa()
{
}

b.cpp
aaa();

那么b.cpp就会报找不到aaa,因为b.cpp看不见它函数体。这就是为什么一般内联函数都放在头文件里,这样每个.cpp里都有一份函数体…………[/quote]
我不只是定义了一个内联,其他内联函数的定义也没放在头文件里,但是不会报错。所以我想可能是这些函数编辑器判定它不能作为内联吧
棉猴 2018-09-17
  • 打赏
  • 举报
回复
个人感觉出现这种情况的原因是报错的那个函数体内部可能又调用了一些其他的函数,否则不可能出现有的内联函数不报错而有的报错的情况。

kbasm 2018-09-17
  • 打赏
  • 举报
回复
引用 8 楼 weixin_42359982 的回复:
我想可能是第二条吧,函数是不是用内联由编译器决定


具体原因是,内联函数定义需要出现在每个调用它的.cpp中。所以如果你的内联函数是
a.h
inline void aaa();

a.cpp
inline void aaa()
{
}

b.cpp
aaa();

那么b.cpp就会报找不到aaa,因为b.cpp看不见它函数体。这就是为什么一般内联函数都放在头文件里,这样每个.cpp里都有一份函数体…………
weixin_42359982 2018-09-17
  • 打赏
  • 举报
回复
我想可能是第二条吧,函数是不是用内联由编译器决定

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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