我很难理解编译器是如何工作的,特别是在处理头文件和库文件时容易混淆。希望有人能够帮我澄清一下。
我很难理解编译器是如何工作的,特别是在处理头文件和库文件时容易混淆。希望有人能够帮我澄清一下。
可以这样形象地理解(免责声明:这是一个非常高级的比喻😉):
这就是“接口”和“实现”的基本区别;接口(头文件)告诉你如何调用一些功能(而不需要知道它是如何工作的),而实现(库文件)则是真正的功能。
请注意:这个概念非常基础,因为它让你具有灵活性:你可以针对不同的库使用相同的头文件(即以完全相同的方式调用功能),每个库可能会以不同的方式实现功能。通过保持相同的接口,你可以在不改变你的代码的情况下替换库。
此外:你可以更改库的实现而不会破坏调用代码!
Util.lib
,我如何调用它的函数?我需要包含与 Util.lib
相关的头文件吗? - Elshan头文件一般用于定义应用程序中的接口或一组接口。 可以将头文件视为显示程序的外部功能,同时省略技术实现细节的内容。
例如,如果您要优化程序,则很可能会修改源(.cpp)文件以改进算法,但是头文件不会更改,因为外部客户端仍然使用相同的参数和返回值调用方法。
在像C ++这样的面向对象语言中,头文件通常包括以下内容:
虽然代码可以在头文件中实现,但通常不建议这样做,因为它可能会在代码中引入额外的耦合和依赖关系。
在某些情况下(例如模板类),出于技术原因,必须在头文件中定义实现。
库是一组代码,您希望将其提供给程序或一组程序使用。 它包括特定接口或一组接口的实现。
在库中定义代码可避免代码重复,并鼓励重用。 库可以进行静态链接(.lib)或动态链接(.dll):
静态链接库定义一组导出符号(可以视为方法定义),然后在构建过程的链接阶段将它们链接到最终可执行文件(.exe)中。 它具有更快的执行时间的优点(因为不需要动态加载库),代价是二进制文件较大(因为方法实际上是在可执行文件中复制的)。
动态链接库在程序执行期间进行链接,而不是程序链接时。 当多个程序需要重用相同的方法时,它非常有用,并且在诸如COM等技术中广泛使用。
可能会让你感到困惑的是,在C++中,单词library可以有几种不同的含义。其中一种意义已在这里得到了很好的讨论:
二进制文件中可链接函数的集合。这些函数可以静态链接或动态链接。
但是还有另一种类型的库:所谓的头文件库(包括STL、TR1和Boost的部分)。它们并不存在于单独的二进制形式中,因此单词library并不指代特定的二进制文件,而是指代一组包含的头文件。
希望这可以帮到你。
头文件只包含声明,而库文件还包含实现。
一个库是编译成一组目标文件的代码。这些目标文件包含了编译后的机器代码和代码所使用的数据声明。
头文件定义了库的接口:它告诉你如何正确地使用库。在C/C++中,头文件给出了函数名称列表以及如何调用这些函数的方法:它们所需的参数数量和类型、返回类型、调用约定等等。头文件还有很多其他内容,但归根结底,它们都是为了调用库代码而制定的一套规则。
头文件通常用于包含原型。头文件在预处理时扩展,以便在编译时,代码可以访问相关的函数声明/原型。
库是实际包含函数原型定义的软件(在头文件中)。库在链接时使用。定义(在库中)在链接时解析。
最初的回答:
头文件包含函数原型,库包含函数原型的定义。头文件在预处理时扩展,以便在编译时访问函数声明。库在链接时使用,并在链接时解析函数定义。
头文件是声明函数的文件。使用头文件可以访问特定的函数。
而
库文件则是定义特定函数的文件。 MATH.H是一个头文件,而MATH.LIB则是库文件。
一个库是为偶尔使用而收集的类似对象的集合。它通常包含以对象或源代码形式的程序、模板等。
头文件是库的位置(接口)。
头文件和库在程序中的工作原理。
头文件包含指向库的链接(库包含标准函数和方法),编译器通过预处理器识别源代码中使用的标准函数,预处理器在程序实际编译之前解析所有指令(指令是以 # 符号为前缀的程序行,其中包括)。
感谢阅读!