首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C和H文件的不同作用!该怎么处理

2012-02-27 
C和H文件的不同作用!!H文件和C文件怎么用呢?一般来说,H文件中是declare(声明),C文件中是define(定义)。因为

C和H文件的不同作用!!
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啊。
      这段内容我没有理解到,上面的兄弟兄弟想要转达一个什么意思?请教了!这段内容也是直接转载别人的东西!

[解决办法]
主要是预处理的#include指令的含义。#include的功能主要是在编译期间把指定的文件包含进当前内容,相当于在编译时把指定文件的内容拷贝到当前的文件。假如有N个源文件要引用同一个头文件的话,那么编译的时候那个头文件就会在每个源文件中拷贝一份,相当于多出了N份拷贝。那么目标文件的体积肯定要变大。而extern是C语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,以标示变量或者函数的定义在别的文件中。extern只有在连接的时候才会去别的模块寻找,而不用拷贝到当前的文件中,体积自然小了。
[解决办法]
很详细了。好好体会吸收就行了:)

热点排行