为什么内联函数必须放在头文件中呢?

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)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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