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

Xon*_*ara 73 c c++

我很难理解的一件事是编译器是如何工作的.我遇到了很多困难,但特别是我总是把标题和库混在一起.如果有人能稍微清楚一点,那就太好了.

bee*_*f2k 115

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

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

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

注意:这个概念是如此基础,因为它允许您灵活性:您可以为不同的库具有相同的头(即,以相同的方式完全调用功能),并且每个库可以以不同的方式实现功能.通过保持相同的接口,可以更换库不改变你的代码.

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

  • 呃......我仍然没有得到一些东西。一方面,我什至不完全确定库是如何派生的,我编译的所有程序似乎都不需要它们——它们只是没有生成。我假设需要定义库?但是忽略这一点,主要源文件在哪里发挥作用?我认为头文件是用于实现的,而主要的源文件是用于接口的——库只需要编译可执行文件......无论如何,如果它们是静态的。 (2认同)
  • 库是程序化的:您可以编写程序或编写库. (2认同)
  • 如果我从其他人那里得到了库.例子`Util.lib`我怎么称呼它的功能?我是否需要包含与U`til.lib相关的头文件? (2认同)

Leo*_*Hat 52

头文件通常用来定义一个接口或应用程序中设置的接口.将头文件视为显示程序外部功能的内容,同时省略技术实现细节.

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

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

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

虽然没有什么可以阻止代码在头文件中实现,但这通常不受欢迎,因为它可以在代码中引入额外的耦合和依赖.

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


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

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

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

  • 动态链接库中的程序的执行,而不是节目的链接过程中连接.当多个程序需要重用相同的方法时,它很有用,并广泛用于COM等技术.


jwf*_*arn 9

可能让您感到困惑的一件事是,单词在C++中可以有多种含义.这里有一个很好的讨论:

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

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

希望这可以帮助.


Ada*_*eld 8

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

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


Moa*_*ini 7

标头只包含声明,而库也包含实现.