头文件与库的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mormont/article/details/53009795

昨天突然问了一下什么是头文件,我一听就傻了,虽然上课的时候老师在讲编译的四个过程的时候说了一下,但是还是不太理解,我们知道编译过程中的预处理阶段会进行头文件展开,宏替换以及条件编译。那么什么是头文件呢?

百度百科是这样定义的:头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 .c就是你写的程序文件。

其实我一开始对头文件的理解和库差不多,比如我在程序前面加上了math.h这个头文件,我就能在我的程序里调用一些有关数学的函数。当然了我的理解并不正确,其实头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。

对于头文件和库的区别我们可以这样理解:就是头文件提供的是一个函数的声明,并没有这个函数具体代码,而库呢就是存放这个函数的具体实现代码。

c语言在编译过程中会经过预处理(需要头文件),编译,汇编,链接(需要库文件)。执行的时候可能还有动态链接过程。在编译的时候只要有头文件的声明就可以了,在链接的时候,把已经编译好的.obj和现有的.lib文件进行链接,这时就可以最终生成可执行文件了。

其实头文件与其实现文件或相应lib文件都没有直接的联系。头文件是告诉编译器函数是如何去调用如何返回的,所有实现都是分别编译,最后在链接阶段链在一起。头文件包含声明,库文件包含实现或者与动态库的连接 。所以如果在代码里要用到这些函数那么就要包含头文件,编译的时候才能知道这些函数的原形,在进行代码连接的时候就需要库文件了,这时连接器就把函数的实现代码(静态库)连接到你的程序或者将你的函数调用连接到相应的动态库中对应函数, lib是静态库,编译的时候代码直接插入到你的程序 ,编译的时候,只是产生一些调用动态库内代码的导入表,真正运行的时候是调用的动态库内的代码。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页