说我已经通过A.hpp
语句将两个头文件B.hpp
和A.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也是受欢迎的。
答案 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
& 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 option至g++
找出所包含的内容(甚至可以使用各种-M
...选项播放技巧)。
也许您可能希望分发源代码的合并(例如SQLite does),但这需要一些精心设计。
(但它是特定于项目的,并且比您的想法简单得多,正是因为标准标题在您的项目中的作用)