【问题标题】:What's the difference between a header file and a library?头文件和库有什么区别?
【发布时间】:2010-10-29 19:08:01
【问题描述】:

我很难理解的一件事是编译器的工作原理。我遇到了很多困难,但特别是我一直把标题和库搞混了。如果有人能把事情弄清楚一点,那就太好了。

【问题讨论】:

  • C 和 C++ 是不同的编程语言。两者都是规范 - 不是软件!- 以某种标准编写(主要是英文),例如 C 的 n1570 和 C++ 的 n3337

标签: c++ c


【解决方案1】:

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

  • 标题是您可以拨打的电话号码,而...
  • ...图书馆是您可以在那里找到的真正的人!

这是“接口”和“实现”的根本区别; 接口(标题)告诉您如何调用某些功能(不知道它是如何工作的),而实现(库)是实际的功能。

注意:这个概念非常基础,因为它允许您灵活使用:您可以为不同的库拥有相同的标头(即功能以完全相同的方式调用),并且每个库都可以实现 以不同的方式实现功能。通过保持相同的界面,您可以在不更改您的代码的情况下替换库。

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

【讨论】:

  • Ehh... 我还是没有在这里得到什么。一方面,我什至不完全确定库是如何派生的,我编译的所有程序似乎都不需要它们——它们只是没有生成。我假设需要定义库?但是忽略这一点,主要源文件在哪里发挥作用?我认为头文件用于实现,而主要源文件用于接口 - 库只需要编译可执行文件......无论如何,如果它们是静态的。
  • 库是程序化的:您可以编写程序,也可以编写库。
  • 如果我从其他人那里得到库。示例Util.lib 我如何称呼它的功能?我是否需要包含与 Util.lib 相关的头文件?
  • 对于header,我明白你的意思,但关于实施,我仍然感到困惑。因为,通常,源文件包含实现对吗?如果我们已经有了源文件,那我们为什么还需要library呢?非常感谢您!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

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


      是您希望提供给程序或程序组的代码集合。它包括特定接口或一组接口的实现

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

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

      • 动态链接库在程序执行期间被链接,而不是在程序链接期间。当多个程序需要重复使用相同的方法时,它很有用,并且广泛用于 COM 等技术。

      【讨论】:

      • 那么,这是否意味着当我的 .c 文件(包括 stdio.h 文件中的所有文本 + 我自己的源文件)被编译为目标文件(.o 文件)时,它不会t 包含实际与 I/O 设备交互的代码?
      • “它具有更快执行时间的优势” - 并非总是如此。当某个库已经被其他程序加载到内存中时(因此会缩短当前程序的加载时间),那么动态链接的程序可能会运行得更快。
      【解决方案5】:

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

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

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

      希望这会有所帮助。

      【讨论】:

        【解决方案6】:

        套用一句经典笑话,区别在于库有头文件,而头文件没有库。

        【讨论】:

          【解决方案7】:

          头文件描述如何调用功能,库包含实现此功能的编译代码。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              头文件是写函数声明的文件。通过使用头文件,我们可以访问特定的函数

              同时

              LIBRARY FILE 是写入特定函数定义的文件。 MATH.H 是头文件,而 MATH.LIB 是库文件。

              【讨论】:

                【解决方案10】:

                HEADER File 和 LIBRARY 在程序中的工作。

                头文件包含指向的链接(库包含标准函数和方法),编译器通过预处理器识别源代码中使用的标准函数,即在程序实际编译之前解析所有指令(指令是程序中以 # 符号开头且包含的行)。

                感谢阅读!

                【讨论】:

                  【解决方案11】:

                  我认为库是一个代码包,可以多次重复使用,并且该代码是预编译的,因此它以标准形式提供,因此我们不必为我们开发的每个程序编写该代码。 头文件以简单的方式包含对该代码的引用,我们在程序中使用的“cin”和“cout”等函数在标准库中完全定义,而像iostream头文件这样的头文件包含对该代码的引用。 因此,当我们编译我们的代码时,我们只需为 cin 和 cout 预编译,我们不必每次使用 cin 和 cout 时都编写代码。 或者以更简单的方式,我们可以说库包含所有函数的代码,而头文件是访问该代码的方式。

                  【讨论】:

                    【解决方案12】:

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

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

                    【讨论】:

                      【解决方案13】:

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

                      【讨论】:

                      • 这个比喻有点……太抽象了。
                      【解决方案14】:

                      库中的代码只会根据头文件的需要存储。整个头文件都会被存储,这样可以节省处理器存储区域。

                      【讨论】:

                      • 欢迎来到 StackOverflow 并感谢您提供帮助。但是,如果您为了清晰和可读性而重新措辞,您的答案可能会有所帮助。使用一些降价进行格式化可能会有所帮助。标头和库之间的区别还有其他更重要的方面,而不是它们的存储量。
                      【解决方案15】:

                      您可以考虑这个例子来理解 - Math.h 是一个头文件,其中包含函数调用的原型,如 sqrt()pow() 等,而 libm.liblibmmd.liblibmmd.dll 是其中的一些数学库。简单来说,头文件就像一张名片,图书馆就像一个真实的人,所以我们使用名片(头文件)来访问真实的人(图书馆)。

                      【讨论】:

                        【解决方案16】:

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

                        库是包含函数原型定义的实际软件(出现在标题中)。链接时使用库。定义(存在于库中)在链接时解析。

                        【讨论】:

                          猜你喜欢
                          • 2020-08-19
                          • 2011-03-11
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-09-16
                          • 1970-01-01
                          • 2023-03-22
                          • 1970-01-01
                          相关资源
                          最近更新 更多