头文件和库之间有什么区别?


80

我很难理解的一件事是编译器如何工作。我遇到很多困难,但是特别是我一直在混淆头文件和库。如果有人可以解决问题,那就太好了。


1
C和C ++是不同的编程语言。无一不是规范-而不是软件-在一些标准的编写(主要是英语),像n1570 C和n3337的C ++
巴西莱Starynkevitch

Answers:


126

这样想一下(免责声明:这是一个非常高级的类比;)..

  • 标题是您可以拨打一个电话号码,而...
  • ...图书馆是您可以到达的真正的人!

这是“接口”和“实现”之间的根本区别;在接口(头),告诉你如何调用一些功能(不知道它是如何工作),而实现(库)是实际的功能。

注意:这个概念非常基础,因为它使您具有灵活性:您可以为不同的库使用相同的头(即,以相同的方式准确地调用功能),并且每个库都可以以不同的方式实现功能。通过保持相同的接口,可以更换库不改变你的代码。

并且:您可以在不破坏调用代码的情况下更改库的实现!


2
嗯...我还是没收到东西。首先,我什至不能完全确定库的派生方式,我编译的所有程序似乎都不需要它们-它们只是没有生成。我假设需要定义库?但是忽略了这一点,主要源文件在哪里发挥作用?我认为标头用于实现,而主要的源文件用于接口-库仅是编译可执行文件所必需的...如果它们是静态的,无论如何。
Xonara

2
库已编程:您可以编写程序或编写库。
TomTom 2012年

2
如果我是从别人那里得到的图书馆。示例Util.lib如何调用它的函数?我是否需要包含与U相关的头文件til.lib
Elshan

56

头文件通常用于在应用程序中定义的接口的一个接口或集。可以将头文件视为表示程序外部功能的东西,而忽略技术实现细节。

例如,如果您正在优化程序,则很可能会修改源(.cpp)文件以改进算法,但是头文件不会更改,因为外部客户端仍使用相同的参数集调用方法,并且返回值。

在像C ++这样的面向对象的语言中,头文件通常包括以下内容:

  • 类描述和继承层次结构
  • 类数据成员和类型
  • 类方法

尽管没有什么可以阻止在头文件中实现代码,但是通常不希望这样做,因为它会在代码中引入额外的耦合和依赖性。

在某些情况下(例如模板类),出于技术原因,必须在头文件中定义实现。


一个是一个代码集合,你要提供一个程序或程序组。它包括执行特定的接口或接口集。

在库中定义了代码,以防止代码重复并鼓励重用。库可以是静态链接(.lib)或动态链接(.dll):

  • 静态链接库定义了一组然后被在生成过程中的连接阶段链接到最后的可执行文件(.exe)导出符号(其可以被认为是方法定义)的。它的优点是执行时间更快(因为不需要动态加载该库),但以更大的二进制文件为代价(因为方法本质上是在可执行文件中复制的)。

  • 动态链接库中的程序的执行,而不是节目的链接过程中连接。当多个程序需要重用相同的方法时,它很有用,并且在诸如COM之类的技术中得到了广泛的使用。


10

可能使您感到困惑的一件事是,单词在C ++中可能具有多种含义。这里已经充分讨论了一种含义:

二进制文件中一组可链接的函数。这些可以静态链接也可以动态链接。

但是还有另一种类型的库:所谓的仅标头库(包括STL,TR1和Boost的一部分)。这些不以单独的二进制形式存在,因此单词不是指特定的二进制文件,而是指一组包含的头文件。

希望这可以帮助。


8

库是代码,被编译为一组目标文件。目标文件包含已编译的机器代码和该代码使用的数据声明。

头文件定义库的接口:它告诉您如何正确使用库。在C / C ++中,头文件为您提供了函数名称以及如何调用这些函数的列表:它们采用的参数的数量和类型,返回类型,调用约定等。头文件中还有许多其他内容它们也一样,但是最后归结为一组调用库代码的规则。



2

如果以编程语言编写的图书馆是普通图书馆,那么可以将图书馆中存在的许多书籍与语言中的函数/方法进行比较。头文件也可以与书的行号进行比较假设在海得拉巴的某个图书馆中有一本书,并且在该图书馆中,该书存在于第24行中……以同样的方式给出图书馆的地址通过使用命名空间std(用于标准库),行号由头文件给出,在头文件中放置了同一时间的所有书籍(在这种情况下为方法)(与输入/输出流有关的所有方法)



1

HEADER FILE是写函数声明的文件,使用头文件可以访问特定的函数

库文件是在其中写入特定功能的定义的文件。MATH.H是头文件,而MATH.LIB是库文件。


1

HEADER文件和库在程序中的工作。

头文件中包含的链接(库包含标准函数和方法),编译器识别经由预处理器的源代码中使用的标准的功能,可以解决所有的指令(指令在程序中的线之前通过包括#号),然后再实际编译程序。

谢谢阅读!


1

我认为库是一个可以重复使用很多次的代码包,并且该代码是经过预编译的,因此可以以标准形式使用,因此我们不必为开发的每个程序编写该代码。头文件以简单的方式包含对该代码的引用,我们在程序中使用的函数(如“ cin”和“ cout”)已在标准库中完全定义,而头文件(如iostream头文件)包含对该代码的引用。因此,当我们编译代码时,我们只需要对cin和cout进行预编译,而不必每次使用时都为cin和cout编写代码。或者,以更简单的方式,我们可以说一个库包含所有功能的代码,而头文件就是到达该代码的方式。


1

库是偶尔使用的类似对象的集合。它通常包含目标或源代码形式的程序,模板等。

头文件是库的位置(接口)


1

标头通常用于包含原型。标头在预处理时扩展,因此在编译时,代码可以访问相关的函数声明/原型。

库是实际的软件,其中包含功能原型的定义(在标头中)。链接时使用库。定义(存在于库中)在链接时解析。


0

用经典的笑话来解释,区别在于库中有一个头文件,而头文件中没有库。


0

图书馆就像死掉的木乃伊一样,缠着白色的长线。他们死了。释放它们的唯一方法是通过头文件。头文件包含使它们栩栩如生的方法,并且可以多次实现(代码重用)。


2
这个比喻有点...太抽象了。
byxor

0

到understand-你可以考虑这个例子Math.h是一个头文件,其中包括原型的函数调用一样sqrt()pow()等等,然而libm.liblibmmd.liblibmmd.dll是一些数学库。简单来说,头文件就像名片,图书馆就像真实的人,因此我们使用名片(头文件)到达实际的人(图书馆)。


-4

来自库的代码仅在需要时存储头文件。整个头文件将被存储,从而节省了处理器的存储区域。


欢迎使用StackOverflow,并感谢您的帮助。但是,如果您为了更清晰和可读性而重新措辞,则可能会有所帮助。使用一些markdown进行格式化可能会有所帮助。头文件和库之间的差异比存储多少文件头还有其他更重要的方面。
Yunnosch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.