【问题标题】:Include multiple header-files at once with only one #include-expression?一次包含多个头文件,只有一个#include-expression?
【发布时间】:2020-02-09 18:14:27
【问题描述】:

是否有任何表达式可以让语法同时包含多个标头,而无需为每个新文件编写“#include”表达式?

例如:

#include <stdio.h>, <stdlib.h>, <curses.h>, <string.h>  /* Dummy-Expression 1. */

OR

#include <stdio.h> <stdlib.h> <curses.h> <string.h>     /* Dummy-Expression 2. */

问题是针对 C 和 C++ 的。

【问题讨论】:

  • 包含大量 #include 语句的自制头文件的一个大问题是,当众多头文件之一发生更改时,所有内容都需要重新编译/重新链接/重新安装。这是生产环境中的主要 PITA

标签: c++ c syntax include header-files


【解决方案1】:

不,没有办法做到这一点。您必须将每个 #include 输入(或复制)到自己的行中,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>

这适用于 C 和 C++。

其他一些答案讨论了创建另一个包含这些的头文件,但我不打算讨论这样做。一般来说,这是一个坏主意,会导致命名空间污染等问题,并且在更改该头文件时需要重新编译。

【讨论】:

  • 为什么投反对票?这个答案有什么我可以改进的吗?
【解决方案2】:

不,没有。

为您希望执行的每个包含操作编写一个#include 指令。

但是,您可以拥有一个“实用程序”标头,该标头除了包含您经常使用的许多其他标头之外什么都不做。然后,您只需包含该一个实用程序标头。这是否是一个好主意,是一个见仁见智的问题。

如果你走那条路,don't be tempted to start relying on internal implementation headers

【讨论】:

    【解决方案3】:

    您可以创建一个包含所有常见包含的头文件并将其包含在您的文件中:

    文件common.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <curses.h>
    #include <string.h>
    

    您可以在您的文件中包含该文件:

    #include <common.h>
    

    【讨论】:

    • 我在自己的回答中也提到了这一点。当然,它可以工作——但这​​通常是一件很糟糕的事情。它最终包含不必要的头文件,这会污染全局命名空间(如果全局完成)并给编译器额外的工作。您的回答(恕我直言)应该提到这一点并不鼓励这个解决方案。
    • @JesperJuhl “这通常是一件很糟糕的事情。”过于宽泛的说法。花时间仅包含所需的标准头文件(根据 OP 示例)并不能有效地利用程序员的 *.c 文件时间。根据您的团队标准编写代码。当然,您可能会节省适度的编译时间。此外,如果由于包含&lt;string.h&gt; 等而发生冲突,即使.c 文件中没有使用标准字符串函数。我想知道。
    • @chux 不要低估有多少不必要的包含会减慢构建速度 - 从而减慢程序员的时间。我目前使用的代码库过去在 20 核(40 线程)机器上构建需要超过 25 分钟。在花了一些时间清理我们的标头(以及其他一些小事情)之后,我们现在在大约 6 分钟内构建了该代码(从头开始)。这是重要的。当然,单个包含无关紧要。但是,当它在数千个文件中包含多个内容时,它会加起来并增加模块之间的依赖关系,如果没有这些包含,这些模块就不必重新构建。
    【解决方案4】:

    它可以在辅助标题的帮助下完成,包括标题:

    #define HEADERS (<stdio.h>)(<stdlib.h>)(<curses.h>)(<string.h>)
    #include "Headers.inl"
    

    Headers.inlHEADERS 序列中的每个项目执行包含:

    // Headers.inl
    #include <boost/preprocessor/seq.hpp>
    
    #if(0 < BOOST_PP_SEQ_SIZE(HEADERS))
    #include BOOST_PP_SEQ_ELEM(0, HEADERS)
    #endif
    
    #if(1 < BOOST_PP_SEQ_SIZE(HEADERS))
    #include BOOST_PP_SEQ_ELEM(1, HEADERS)
    #endif
    
    #if(2 < BOOST_PP_SEQ_SIZE(HEADERS))
    #include BOOST_PP_SEQ_ELEM(2, HEADERS)
    #endif
    
    #if(3 < BOOST_PP_SEQ_SIZE(HEADERS))
    #include BOOST_PP_SEQ_ELEM(3, HEADERS)
    #endif
    
    …
    

    可以通过让 boost 预处理器使用 BOOST_PP_SEQ_POP_FRONT 处理所有重复并递归包含自身来简化它。

    【讨论】:

    • 对于一个应该像“否”这样简单的答案来说,这只是太多的预处理器诡计。不过还是蛮有趣的。
    【解决方案5】:

    没有语法。但是,如果您真的想要这样的东西,那么只需创建一个新标题,其中只包含多个 #include 语句用于您想要的标题,然后在需要时使用 #include "combo-header.h"。 不过我不鼓励这样做。最好只在你使用它的地方明确地包含你使用的东西——有几个原因;编译时间和命名空间污染是最重要的。

    【讨论】:

      【解决方案6】:

      是的,您可以使用#include 此头文件包括所有标准头文件。唯一的问题是,它会包含很多程序不需要的不必要文件,而且由于它包含很多头文件,所以编译时间会增加。 如果您在程序中经常使用某些特定的头文件,那么您可以制作自己的头文件并将所需的文件包含在您创建的头文件中。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 2021-05-10
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多