赞
踩
很多书讲得不是很详细的。
简单说:
.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 ,如需转载请自行联系原作者
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。