VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 476|回复: 8

[已解决]内联函数疑问

[复制链接]
44_avatar_middle
最佳答案
0 
在线会员 发表于 2021-1-14 15:35:38 | 显示全部楼层 |阅读模式
首先我新建了一个a.h头文件,里面有一个void a() {},这里连声明定义一起了。那么我新建一个a.cpp和b.cpp,在这个两个文件里都#include“a.h”,这个时候编译,肯定会出错。因为重复定义了。
解决方法1:在a.h里面只放函数声明,再新建一个ah.cpp里面放函数定义。
解决方法2:把a.h里面的函数声明为内联函数。

然后我讲一下我对内联函数的理解,也查了一些资料,内联函数就是在调用函数的时候不进入函数,而是直接把函数调用的这个地方把函数里的内容展开,减少了入栈出栈的过程。这里有一个注意点,就是内联函数是编译器看这个函数定义的复杂性去决定是当普通的函数用还是当内联函数用,不是说只要是内联函数,就直接把内容展开是吧。

那我现在有一个疑问:我直接把要用的函数全部用内联函数来搞不就行了,包括声明和定义全部写在a.h里不就好了,还不用分成两个文件,而且编译器还会自动判断是当内联函数还是普通的函数来用。这个缺点我查过就是程序的体积会变大,那除了这个缺点还有其他缺点吗

最佳答案
31_avatar_small
2021-1-17 17:15:23
a86116403 发表于 2021-1-17 11:48
如果编译器判定为不当内联函数用的话,会不会包定义重复的错误

如果编译器认为不可内联应该就是正常的函数,不会报错,
如果你定义了两个同名函数肯定会报错的,即使一个定义为内联函数,另一个正常函数也会报错的,
如果是重载函数则不会报错的,可以上机试试!




上一篇:各位大佬,sqlserver2005,2008和2014的使用差异大吗?
下一篇:多进程窗体问题
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-14 20:58:06 | 显示全部楼层
inline只是给编译器的建议,并不是你声明了inline就一定给你inline的,这是编译器优化的,你可以关闭优化试试。
44_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-1-15 01:38:47 来自手机 | 显示全部楼层
cpp2019 发表于 2021-1-14 20:58
inline只是给编译器的建议,并不是你声明了inline就一定给你inline的,这是编译器优化的,你可以关闭优化试 ...

所以声明函数全部申明成内联函数不是更好吗
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-15 16:25:47 来自手机 | 显示全部楼层
a86116403 发表于 2021-1-15 01:38
所以声明函数全部申明成内联函数不是更好吗

你当然可以这么做,但是编译器会优化,不推荐这么做,谷歌C++编程风格指南中的原话:“仅当函数只有10 行甚至更少时才将其定义为内联函数. ”,华为规定函数只有5行以内才定义为内联函数。

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

44_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-1-17 11:48:41 | 显示全部楼层
cpp2019 发表于 2021-1-15 16:25
你当然可以这么做,但是编译器会优化,不推荐这么做,谷歌C++编程风格指南中的原话:“仅当函数只有10 行 ...

如果编译器判定为不当内联函数用的话,会不会包定义重复的错误
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-17 17:15:23 | 显示全部楼层    本楼为最佳答案   
bestAnswer
a86116403 发表于 2021-1-17 11:48
如果编译器判定为不当内联函数用的话,会不会包定义重复的错误

如果编译器认为不可内联应该就是正常的函数,不会报错,
如果你定义了两个同名函数肯定会报错的,即使一个定义为内联函数,另一个正常函数也会报错的,
如果是重载函数则不会报错的,可以上机试试!
44_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-1-18 15:47:17 | 显示全部楼层
cpp2019 发表于 2021-1-17 17:15
如果编译器认为不可内联应该就是正常的函数,不会报错,
如果你定义了两个同名函数肯定会报错的,即使一 ...

内联函数,编译器判定内联,不报错
内联函数,编译器判定不内联,普通函数调用,不报错,
既然都不报错,那直接在一个h文件声明定义全写一起好了,全部用内联函数写
83_avatar_middle
最佳答案
1 
在线会员 发表于 2021-1-19 10:07:40 | 显示全部楼层
分开成.h和.cpp还有一个重要的点就是封装(把函数(方法)的实现隔离),这样可以保护你程序的安全性
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-19 13:51:15 | 显示全部楼层
a86116403 发表于 2021-1-18 15:47
内联函数,编译器判定内联,不报错
内联函数,编译器判定不内联,普通函数调用,不报错,
既然都不报错 ...

你个人的程序想怎么写就怎么写吧,反正编译器会帮你优化,能编译通过就成。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2021-3-4 05:12

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表