社区
C语言
帖子详情
为什么内联函数必须放在头文件中呢?
NOldkiller
2002-05-22 05:25:10
是不是和编绎有关系?
...全文
1599
23
打赏
收藏
为什么内联函数必须放在头文件中呢?
是不是和编绎有关系?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fishbin11
2002-05-23
打赏
举报
回复
因为这是编译程序首先要连接的文件,以便找到以下我们所使用的相应的函数的程序体。因此它必须用在你所使用的相应函数的前面。
shuimushao
2002-05-23
打赏
举报
回复
应该是内联函数必须声明和定义在一起
wangran
2002-05-23
打赏
举报
回复
不知道理解得是否正确,最好你能看看原书,我经常把原话写上去的原因就是怕自己理解错误而误导人!
wangran
2002-05-23
打赏
举报
回复
我觉得它的意思是说放在头文件中,如果编译器没有让它成为inlined函数,可以让其他用到它的文件都产生一份outlined(相对于inlined)函数。
hxl777
2002-05-22
打赏
举报
回复
是为了代码的调用的方便而已,因为内联函数,必须INLINE加在定义(函数体)前面(而不是声明前面)才有效,而我们通常的头文件一直存放的是函数的声明,定义在实现文件中.所以,从某种意义上来讲,若要被多个单元调用的话,那就只好把函数体都放在头文件中了。
kaneboy
2002-05-22
打赏
举报
回复
1
以下是Essential C++中的原话:
为了能够扩展Inline函数的内容,在每个调用点上,编译器都得取得其定义。这意味着我们必须将inline函数的定义置于头文件,而不是把它放在各个不同的程序代码文件。
我的理解是:在多文件程序中,由于inline函数可能会被编译器插入到每个文件里面,所以如果把inline函数放在某个cpp文件中,编译器可能不能找到这个inline函数而出错,但如果放在头文件中,由于编译器总是先处理所有的头文件,所以能先找到inline函数的定义。
dreamhead
2002-05-22
打赏
举报
回复
No,没有这种硬性规定,而且,我也确实在实现文件中写过内联函数,可以通过。
但如果放在实现文件中,确实可能会出错。
我们知道,在正常的处理中,这里就不考虑那种将内联作为普通函数处理的情况,一个内联函数会在编译期间被编译器处理,也就是说,在连接期是没有的。
考虑这种情况,编写一个库,通常情况是只提供头文件和库的实现文件的,而不提供具体的源码,如果库在实现时把内联函数放在实现文件中,我们在使用时,就会有这样的问题。
你在自己程序中调用这个函数,由于它在头文件中已经声明,所以编译没有问题,但连接的时候,由于没有相应的具体实现,就会造成连接错误。
所以,如果使用内联尽可能放在头文件中
tinymole
2002-05-22
打赏
举报
回复
加上inline后是可以不用放到头文件里面也能编译,但编译时应该不会认为它是一个内联函数吧。除非它是放到头文件中
NOldkiller
2002-05-22
打赏
举报
回复
感谢wangran(豹子) ,能否简要的说一下?
anrxhzh
2002-05-22
打赏
举报
回复
参考这里的讨论:
http://www.csdn.net/expert/topic/737/737713.xml?temp=.9796869
liem
2002-05-22
打赏
举报
回复
我想通常应该这样做,内嵌函数其连接属性是内部的,跟static类似。
wangran
2002-05-22
打赏
举报
回复
如果需要,我再写,因为连带例子,实在太多!
leasun
2002-05-22
打赏
举报
回复
C++标准中没有规定inline函数必须放在头文件中,只是很多高手建议这么做。
wangran
2002-05-22
打赏
举报
回复
内联函数的定义几乎总是被放在头文件中,这样允许多个编译单元(translation units,亦即原始文件)得以含入相同的头文件并获得其中定义的inline 函数。这是《Effective C++》的第33条即第138页的原话,第33条详细的讨论了inlining的技术,它说明了这样做的原因。我就不一一往上面写了!
NOldkiller
2002-05-22
打赏
举报
回复
但如果类的声明和实现分开的话,c++ primer这本书上说需将内联函数移到头文件中的,简直郁闷至极!
NOldkiller
2002-05-22
打赏
举报
回复
这是C++ primer中作者所说:如果类的定义不放在头文件中的话,使用内联函数需重新将之放入 头文件。但具体原因到底什么,上面也没有解释,我想是 不是如果不放在一起,编绎器会不认为这是个内联函数?
wyalchemy
2002-05-22
打赏
举报
回复
并不是“必须”的!
只是默认情况下在类的定义头文件中写了方法的实现时(不是单纯的声明了),象这样:
class CYourClass{
// some members here
// .......
void YouMethod(){
return;
}
};
这时方法 YouMethod就是就是内联的,无须再加inline关键字了!
如果你需要把方法的声明和实现分开,把实现不放在头文件中,这样也是内联的:
void inline CYourClass::YouMethod(){
return;
}
huang_yi_cn
2002-05-22
打赏
举报
回复
没有这种说法呀
你是不是弄错了。
darkstar21cn
2002-05-22
打赏
举报
回复
这是语法规定,想不是放在头文件中的话——除非类的定义不放在头文件中——这可能吗?不可能吗?可能吗?不可能!
RainWindy
2002-05-22
打赏
举报
回复
如果不在头文件中定义,编译器将认为不是内联函数,则没有达到初始目的
加载更多回复(3)
内联函数
体要
放在
头文件
内联函数
体要
放在
头文件
中
。基本知识。需要的可以看。
C++类的内联成员函数应
放在
哪
复习C++ Primer的时候,看到了关于C++类的内联成员函数的放置,应该
放在
头文件
中
。那么这到底是为什么呢?仅仅是一种代码规范问题还是
必须
这样做呢? 下面我来讲讲我自己的理解吧。要彻底理解这个问题,首先要了解下函数的声明和定义了。我们知道,函数可以在多处声明,但只能在一个地方定义,不然会出现重定义。大部分函数默认是外部链接,而inline函数默认为内部链接。也是说inline函数只能在本文件
中
使用,对其他文件是不可见的。一般我们使用某个类的时候,都是在文件
中
加上该类的
头文件
,以便我们可以使用该类的接口。而我们类的成员函数的实现都是
放在
相应的.cpp文件
中
的,而在.h文件
中
声明。这样
《C语言基础》 之 第6章 函数
课程内容:main函数、自定义函数 之 函数定义、自定义函数 之 函数调用、自定义函数 之 传参和返回值、使用codeblocks IDE进行多文件编程、多文件编程/警告/函数声明、使用
头文件
进行函数声明 、为何防止
头文件
重复包含、
头文件
中
到底放了些什么东西、什么时库函数标准io库、数学库、标准库、全局变量和局部变量
浅谈VC++
中
的内联
内联的语法 在类声明
中
定义方法; 内联方法
放在
类声明之外,但
必须
出现在
头文件
中
,且内联方法声明
中
使用inline标识; 注:inline只是对编译器的建议,是否内联的决定权在编译器; 内联节省的开销 函数调用开销 调用间优化 优秀的编译器可是内联方法的边界难以区分(将代码内联后,对代码进行重新排列) 内联带来的问题 代码膨胀(空间开销) 由于代码膨胀带来的页面缓存命
中
率下降 编译时间增加 修改文件后相关文件都需要重新编译; 由于函数边界模糊,该
内联函数
遇到问题后不好排查;
内联函数
的建议 优化时,只针对高频代码内联; 对于调用频率高的(80%以上场景都会走到的路径): 函数规模<5行:
【C++】
内联函数
为什么定义在
头文件
中
?
最近从新捡起C++,突然有一个想法,为什么
内联函数
的会在
头文件
中
申明和定义。 如果是C++新手,对申明和定义这两个词比较陌生,那么我先解释一下申明和定义的意思(原谅我废话多) 一、申明和定义 申明一般放
头文件
中
,定义一般放.cpp文件
中
。 比如现在我有个计算绝对值的函数。 首先我创建一个abs.h文件申明这个函数: int abs(int a); 然后创建一个abs.ccp文件定义这个函数: #...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章