C和H文件的不同作用!!

yangss2006 2007-08-26 03:37:26
H文件和C文件怎么用呢?一般来说,H文件中是declare(声明),C文件中是define(定义)。因为C文件要编译成库文件(Windows下是.obj/.lib,UNIX下是.o/.a),如果别人要使用你的函数,那么就要引用你的H文件,所以,H文件中一般是变量、宏定义、枚举、结构和函数接口的声明,就像一个接口说明文件一样。而C文件则是实现细节。
H文件和C文件最大的用处就是声明和实现分开。这个特性应该是公认的了,但我仍然看到有些人喜欢把函数写在H文件中,这种习惯很不好。(如果是C++话,对于其模板函数,在VC中只有把实现和声明都写在一个文件中,因为VC不支持export关键字)。而且,如果在H文件中写上函数的实现,你还得在makefile中把头文件的依赖关系也加上去,这个就会让你的makefile很不规范。
最后,有一个最需要注意的地方就是:带初始化的全局变量不要放在H文件中!
例如有一个处理错误信息的结构:
  char* errmsg[] = {
    /* 0 */    "No error",        
    /* 1 */    "Open file error",    
    /* 2 */    "Failed in sending/receiving a message", 
    /* 3 */    "Bad arguments", 
    /* 4 */    "Memeroy is not enough",
    /* 5 */    "Service is down; try later",
    /* 6 */    "Unknow information",
    /* 7 */    "A socket operation has failed",
    /* 8 */    "Permission denied",
    /* 9 */    "Bad configuration file format", 
    /* 10 */   "Communication time out",
    ......
    ......
  };
  
请不要把这个东西放在头文件中,因为如果你的这个头文件被5个函数库(.lib或是.a)所用到,于是他就被链接在这5个.lib或.a中,而如果你的一个程序用到了这5个函数库中的函数,并且这些函数都用到了这个出错信息数组。那么这份信息将有5个副本存在于你的执行文件中。如果你的这个errmsg很大的话,而且你用到的函数库更多的话,你的执行文件也会变得很大。
正确的写法应该把它写到C文件中,然后在各个需要用到errmsg的C文件头上加上 extern char* errmsg[]; 的外部声明,让编译器在链接时才去管他,这样一来,就只会有一个errmsg存在于执行文件中,而且,这样做很利于封装。
我曾遇到过的最疯狂的事,就是在我的目标文件中,这个errmsg一共有112个副本,执行文件有8M左右。当我把errmsg放到C文件中,并为一千多个C文件加上了extern的声明后,所有的函数库文件尺寸都下降了20%左右,而我的执行文件只有5M了。一下子少了3M啊。
这段内容我没有理解到,上面的兄弟兄弟想要转达一个什么意思?请教了!这段内容也是直接转载别人的东西!
...全文
2308 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangss2006 2007-08-26
  • 打赏
  • 举报
回复
就是定义的地方最好只定义一次,因为定义了就会开辟空间,如果每一个都增加近来,那么就相当于定义了N次,但是这样不会提示“重复定义吗?”,而连接的话,不开辟空间,只是找出变量的位置和路径!就是这样,对吧?
sky_ghm 2007-08-26
  • 打赏
  • 举报
回复
很详细了。好好体会吸收就行了:)
foru111111 2007-08-26
  • 打赏
  • 举报
回复
主要是预处理的#include指令的含义。#include的功能主要是在编译期间把指定的文件包含进当前内容,相当于在编译时把指定文件的内容拷贝到当前的文件。假如有N个源文件要引用同一个头文件的话,那么编译的时候那个头文件就会在每个源文件中拷贝一份,相当于多出了N份拷贝。那么目标文件的体积肯定要变大。而extern是C语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,以标示变量或者函数的定义在别的文件中。extern只有在连接的时候才会去别的模块寻找,而不用拷贝到当前的文件中,体积自然小了。
iambic 2007-08-26
  • 打赏
  • 举报
回复
这段内容不是说的挺明白么,还需要被解释?

69,337

社区成员

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

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