【问题标题】:What is the best header structure to use in a library?在库中使用的最佳标头结构是什么?
【发布时间】:2009-04-09 16:23:04
【问题描述】:

关于库中的标题,我看到了两个选项,我不确定这个选项是否真的很重要。假设我创建了一个库,我们称之为foobar。请帮我选择最合适的选项:

  1. 在库项目的最根目录中包含一个,我们称之为foobar.h,它包含库中的所有头文件,例如“src/some_namespace/SomeClass.h”等。然后从库外部,在我想使用与foobar 库有关的任何文件中,只需#include <foobar.h>

  2. 没有主要包含,而是仅在我要使用它们的地方包含我们需要的标题,因此我可能在源文件中有一大堆包含。由于我使用的命名空间有时深达 3,因此包括标题似乎有点麻烦。

我选择了选项 1,因为它很容易实施。 OpenGL 和许多其他库似乎都这样做了,所以这似乎是明智的。但是,标准 C++ 库可以要求我在任何给定文件中包含多个头文件,为什么他们不只有一个头文件?除非是我和白痴,而且它们是独立的库......

更新:

进一步回答,我认为提供这两个选项是有意义的,对吗?如果我想使用 std::string 但必须包含大量头文件,我会非常恼火;那太傻了。另一方面,当我想使用大部分库时,如果我不得不输入大量 #include 行,我会很生气。

转发标题:

感谢所有建议我前锋头球的人,这帮助我减少了头球丛林的复杂性! :)

【问题讨论】:

    标签: c++ header


    【解决方案1】:

    stl、boost等有很多头文件要包含的,他们为你提供了独立的工具,你可以独立使用它们。

    因此,如果您的库是一组解耦工具,您必须选择将它们作为单独的部分包含,以及将整个库包含为一个文件。

    【讨论】:

      【解决方案2】:

      考虑一下您的库将如何使用,并以这种方式组织它。如果有人不太可能在不使用整个事物的情况下使用一小部分,则将其构建为一个大包含。如果一小部分本身是独立且有用的,请确保您可以包含足够的内容。如果有一些有意义的逻辑分组,请为每个组创建包含文件。

      与大多数编程问题一样,没有万能的答案。

      【讨论】:

        【解决方案3】:

        必须处理所有#included 标头。这并不像它可能的那么糟糕,因为现代编译器提供了某种不重复处理它们的选项(可能使用#pragma onceifndef 保护)。尽管如此,每个翻译单元的每个#included 标头都必须处理一次,而且加起来很快。

        通常的做法是头文件只#include 那些他们需要的头文件,并尽可能使用前向声明(class foo;)。这样,您就不会得到开销。

        如果你想#include 一切和它的兄弟,你可以提供你自己的#include 一切的头文件。您不必在每个头文件和源文件中明确写出所有内容。该选项是您可以提供的,但如果 std 中的所有内容都作为一个整体标头出现,您将没有选择。

        【讨论】:

          【解决方案4】:

          每次你#include 一个头文件,你都会让编译器做一些相当辛苦的工作。您#include 的标头越少,它要做的工作就越少,您的编译速度就越快。

          【讨论】:

            【解决方案5】:

            所有包含文件都应该有自己的意义。你应该从 lib-users 位置选择标题结构:用户应该如何使用我的库?哪种结构最适合用户?



            示例:
            如果您的库提供了字符串算法 - 最好用所有文件制作一个标题 - string_algorithms.h;
            如果您的库提供了某个外观对象 - 最好使用一个头文件(可能很少有其他带有扩展名或帮助程序的文件);
            如果您提供将独立使用的复杂对象,则制作不同的头文件(容器库提供不同的容器);

            【讨论】:

              【解决方案6】:

              Forward declare 不是一次包含所有这些头文件,而是在需要时包含。

              【讨论】:

                【解决方案7】:

                无论您决定为库的公共 API 提供哪些头文件(一个、几个或某种组合),为私有 API 至少拥有一个单独的头文件总是一个好主意。 (无需公开非导出函数和类的原型或仅供内部使用的定义。)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-12-15
                  • 2020-09-22
                  相关资源
                  最近更新 更多