当前位置:   article > 正文

关于.h .cpp和inline的讨论

c++ inline函数是在h还是cpp中

很多书讲得不是很详细的。 
简单说:

.h里面是声明,编译器不会为其建立实体,仅仅是告知所有模块,这个世界上有这么个东东,函数,定义什么的,你们要用,可以,编译器会帮你连接到实体。 
.cpp里面就是实例了,编译器会产生真实的代码段,全局变量也会分配具体的单元(如果能分配的话)

如果在.h文件中强行定义实体,连接的时候,会报告错误,说有个命名拥有多个实体。 
比如你定义char* szData="aaa"; 
这个如果写到.h文件里面,则每个引用该.h的cpp产生的obj里面都有一个szD 
ata的实体,则link程序就晕菜了,不知道哪个算,就报错。 
因此,如果要定义这种具体需要分配单元的字符串变量,需要在.cpp里面定义,然后在.h中声明:char* szData;,看见没,这没有分配单元,只是提醒大家,符号表中有这个szData,大家可以用。 
可见,同样的char*szData,写在.h里面是声明,而写在.cpp里面,是定义。大家别弄混了。

反过来,.h里面声明了,所有的.cpp里面没有定义,则大家不用这个命名也就罢了,如果一用,link又晕菜了,找不到这个命名具体对应哪个地址单元,也会报错。

简单说 
对于变量,.h中可以声明,但是不要有赋初值动作,赋值放到.cpp里面去,就都ok了。 
对于函数,大家其实都知道.h里面声明,在.cpp里面定义,就好了,不过,按照c的习惯,在.h里面的声明前面最好加上extern修饰,这样,即使以后你的函数放在哪个lib或者dll、so里面,也是可以被正确link的。

这里又说一下inline。 
C和C++的实现,我的理解其实是不一样的。 
C里面,要求显式声明inline,而C++中,直接写到.h文件中,类的声明中就好了。 
不过,从编译器角度理解,二者差不多。 
在编译阶段,就是cc阶段,内联函数都是产生代码,但是这些代码是虚代码,本身不会被显式定义地址段,也不会正式进入符号表被调用,而是类似宏一样,被直接展开到每个调用的地方。 
因此到了link阶段,是根本看不到这些函数的,符号表中没有,就好像没有它一样,它已经在前一阶段被自动展开,作为每个调用函数的一部分,编译成原始代码了。 
而普通的函数,link的过程,基本上就是查符号表,安排基栈地址什么的,然后在调用处写上一个call。 
这种先展开和后定址的差异,应该是inline函数和普通函数最大的差异性了。 
嗯,还有一种方法我比较喜欢用。 
不管是inline函数还是普通函数,还是什么变量。 
我在某个cpp里面实现了,但是不在.h里面声明。 
我一直等待用它的时候,在用的函数的cpp实现前面临时声明。这么做的好处是减少内部定义暴露在外的可能性,减少耦合性。

比如我在a.cpp里面定义了函数Func1和char* szData。 
void Func1(void) 

    //... 

char* szData="aaa";

但是我不在a.h里面声明。

b.cpp里面,有个函数Func2要用的时候,我再来声明

void Func1(void); 
char* szData;  //看见没,临时声明 
void Func2(void) 

    //... 
    strcpy(szBuffer,szData); 
    Func1(); 

反正谁用谁声明,不用的别看,这样写,程序bug少很多的。

嗯,如果是inline函数,由于函数实体就是声明,因此,这种用法的话,需要把inline函数全部拷贝一遍过来,而不能简单写个声明了事。

不过,拷贝应该不难吧?呵呵

总的来说,写.h文件有时候要慎重一点,懒一点,能不声明就不声明,因为以后用的人,可能会乱想乱用,造成不必要的bug。

这也说明,其实C和C++一样,都可以做到模块化的内聚编程的,C++呢,通过private,强行拒绝外部的无关使用,告诉用户,许看不许摸。C呢,通过严格控制声明,连看都不准看,呵呵,都是为了保护程序安全。 
内联函数,很多编译器会刻意忽视inline这个声明,如果程序需要用inline优化,需要手动打开,这个要查一下具体的语言编译器的说明。 
gcc下的说明请参考这里 
http://qzone.qq.com/blog/115547829-1219133815 
和这里 
http://blog.csdn.net/hngsc_0/archive/2008/12/13/3509952.aspx

VC基本上是无视inline声明的,它把inline作为自己的手段来控制,比如选择尺寸最大,速度最快时,inline就有效,选择尺寸最小,inline就无效了。可以看看这里。 
http://hi.baidu.com/joyjjjz/blog/item/e9d2347ab62671e92f73b305.html

inline的使用,应该是优化到了极致时采用的一种方法,其提升性能的能力比较有限,很多时候,远远不及一个算法优化来得明显,其实如果不是做高性能程序的话,就没有必要考虑了。

嗯,VC我一般用来做验证,高性能优化主要是针对gcc的,所以对inline在VC下的表现一般不太关心。这是因为Windows本身就是个很重的操作系统,没有什么实时性,也不太适合做高性能应用。如果真的一个应用已经到了需要用inline做优化的地步,一般首选平台都是Linux了,小机器一般就选VxWorks了。 
呵呵,一家之言,欢迎拍砖哈。

本文转自 tonyxiaohome  51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/198747 ,如需转载请自行联系原作者

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/626937
推荐阅读
相关标签
  

闽ICP备14008679号