包含后获取#included头文件

时间:2017-03-12 02:50:01

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

说我已经通过A.hpp语句将两个头文件B.hppA.hpp以及#include "A.hpp"包含在第二个文件中。现在,在分发头文件时,我想要另一个包含单个头文件A_B.hpp的选项,其中包含与A.hpp语句粘贴的#include内容完全相同的代码。

现在我手动复制粘贴内容,因为版本较少,文件大小不多,但有没有自动执行此类操作的方法?像command B.hpp > A_B.hpp

这样的东西

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

#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

得到评估,因为它们需要出现在最终文件中。任何其他方式做这样的taks也是受欢迎的。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  

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

实际上,你不能说A.hpp&amp; B.hpp包含(并且详细信息很重要)。它们可能包含一些系统标头(如来自C标准库的<stdio.h>,或来自C ++标准库的<new><vector>标头。 然后,分发它们的预处理表单(g++ -C -E b.hpp ...的输出)实际上是无用的,因为那个表单包含一些系统和编译器特定的声明/定义,它们可移植到另一个编译器(实际上,GCC 5中的<map>可能与GCC 6中的<map>不兼容。)

标准库的重点在于它们标准化标题(及其公共接口)的名称,如<vector><stdio.h>,但不是其内容的详细信息(和私有实现)。编译选项(如-pthread-std=gnu++11-O ...)可能会影响预处理表单(尤其是common predefined macros)。

您可以使用-H preprocessor optiong++找出所包含的内容(甚至可以使用各种-M ...选项播放技巧)。

也许您可能希望分发源代码的合并(例如SQLite does),但这需要一些精心设计。

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

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