【问题标题】:Get #included header files after including包含后获取#included头文件
【发布时间】:2017-08-02 06:15:54
【问题描述】:

假设我有两个头文件 A.hppB.hppA.hpp 通过 #include "A.hpp" 语句包含在第二个文件中。现在在分发头文件时,我想要另一个选项,其中包含一个头文件A_B.hpp,其中包含与粘贴在其#include 语句上的A.hpp 的内容完全相同的代码。

现在我手动复制粘贴内容,因为版本较少且文件大小不大,但有没有一种自动化的方式来做这样的事情?类似command B.hpp > A_B.hpp

要记住的另一件事,我不想要其他预处理器的东西,比如宏扩展、操作系统检测特定的宏,比如 -

#if defined(__unix__) || defined(__unix) || defined(__linux__)
#define OS_LINUX
#elif defined(WIN32) || defined(_WIN32) || defined(_WIN64)
#define OS_WIN
#elif defined(__APPLE__) || defined(__MACH__)
#define OS_MAC
#else
#error Unknown Platform
#endif

进行评估,因为它们需要出现在最终文件中。也欢迎任何其他方式来执行此类任务。

【问题讨论】:

  • 写个小程序来做,#include的语法没那么复杂。
  • @RichardCritten 当然,如果某些编译器的预处理器中不存在此类功能,我可以并且会这样做。
  • "现在在分发头文件时,我想要另一个选项,其中包括一个头文件 A_B.hpp,其中包含与粘贴在其#include 上的 A.hpp 的内容完全相同的代码声明。” 为什么?
  • @BaummitAugen 让我们说出偏好:) 还易于部署和用户友好。其他人也在这样做 - sqlite.org/amalgamation.html
  • 如果你只有几个标题,你可以稍微不同地解决这个问题。假设A.hpp 包含保护A_H_INCLUDED_,然后在B.h 中,包含A 为#ifndef A_H_INCLUDED_ #include "A.h" #endif,以此类推。然后,您可以通过简单地将所有 A.h 和 B.h 复制到 A_B.h 中来创建合并,这可以说比用文件的内容替换 #include "A.h" 更容易。

标签: c++ c gcc clang c-preprocessor


【解决方案1】:

您需要为此编写自己的脚本。您所要求的远远少于gcc -E 所做的(预处理所有内容)。此外,它比cpp -fdirectives-only 所做的要少,因为您不想递归。您实际上有一个特定于项目的需求,并且您需要为它编写特定于项目的代码。

【讨论】:

    【解决方案2】:

    也许您正在寻找unifdef 实用程序。

    假设我有两个头文件 A.hpp 和 B.hpp 并且 A.hpp 通过 #include "A.hpp" 语句包含在第二个文件中。现在在分发头文件时,我想要另一个选项,它包含一个头文件 A_B.hpp,其中包含与粘贴在其 #include 语句上的 A.hpp 的内容完全相同的代码。

    实际上,您并没有说 A.hppB.hpp 包含什么(细节很重要)。它们可能包含一些 system 标头(例如 C 标准库中的 <stdio.h>,或 C++ 标准库中的 <new><vector> 标头)。 然后,分发它们的预处理形式(g++ -C -E b.hpp ...的输出)实际上是没有用的,因为该形式包含一些系统和编译器特定的声明/定义,不能移植到另一个编译器(实际上,来自 GCC 5 的 <map> 可能与来自 GCC 6 的 <map> 不兼容。

    标准库的全部意义在于它们正在规范化标头的名称(及其 public 接口),例如 <vector><stdio.h>,但不是其内容的详细信息(以及 私有实现)。编译选项(如-pthread-std=gnu++11-O ...)可能会影响预处理的表单(特别是通过common predefined macros)。

    您可以使用-H preprocessor optiong++ 来找出其中包含的内容(或者甚至使用各种-M...选项来玩花样)。

    也许您可能想要分发源代码的合并(例如 SQLite does),但这需要一些仔细的设计工作。

    您可以考虑使用一些外部预处理器,例如 m4GPP

    (但它是特定于项目的,并且比您想象的要容易得多,正是因为标准标题在您的项目中的作用)

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多