头文件与函数定义分离的处理

在工程中很多时候我们需要把函数体与主函数分开处理,相信这种已经非常常见了,只需要在主函数文件中包含#include ”filename.c“即可,当然现在编译器已经足够聪明,不需要写#include ”filename.c“都可以自己找到编译,但是好习惯还是要养成的。而这次我编译Linux系统编程之实现who命令的时候采用的是将函数编译为静态库进行链接的形式。

首先要把函数体拿出使用gcc -c filename.c -o filename.o命令提前翻译为后缀为.o的文件。

xxx@xxx-ThinkPad-X230-Tablet:~/code/unix_linux/who$ ls
!  a.out  show_info.c  show_info.h  show_info.o  showtime.c  showtime.o  who1.c

举例这里包含一些已经打包好的静态库,而编译时需要把主函数文件who1.c,两个静态库show_info.o,showtime.o一起编译,当然此时在主函数文件中who1.c就不能再包含#include ”filename.c“,否则编译时会重复导致出错。

这样做有什么好处呢?众所周知,计算机把C语言编译为计算机能够识别的机器码是需要占用性能的,目前函数较少感觉不出来,但是如果有成千上万个函数,而在实际中会反复多次调用一个函数,那么每次都需要去编译无疑是一种资源浪费。如果都把它们编译为.o文件,那么在使用时就可以直接链接,节省了大量的时间与性能,同时还可以以库的形式保留下来,被其它的函数直接调用。简单来讲,调用多次的情况下翻译好了再使用比用的时候翻译效率差别非常大。

有一种情况实际存在就是,你在写程序使用库的时候,是不知道别人库里的函数文件到底是什么的,因为打包成为静态库已经翻译成了机器码我们是读不懂的,那么一般是如何知道库里的函数到底是什么呢?对了,.h文件就是做这个的,需要在.h文件中进行函数声明,然后在主函数文件中#include ”filename.h“,最后在编译时候记得要把所需要的.o文件一起编译即可。

在此次使用这种方法的时候出现了一个问题,就是我在.h文件中设置了宏定义,但是在具体函数中宏定义并没有生效,经过调试检查,发现必须在函数体的.c文件中也同时#include <>声明函数体.h文件。

可是这样就产生了一个问题,有很多函数体的情况下,那岂不是要有很多.h文件。这时候平时看的内核代码就起了作用,内核的做法是,将所有的.h文件再用一个.h文件进行声明,这样你只需要在每个函数体中声明那个总的.h文件即可。

在编译成为.o文件时,一个个编译未免太过麻烦,并且更新后有的不需要重新编译,只需要编译更新了的文件即可,这时候Makefile就起了关键性作用,Makefile的时候会在以后提到。

你可能感兴趣的:(基础部分)