【发布时间】:2020-03-07 10:48:39
【问题描述】:
如果我通过-E 或-save-temps 命令行参数,GCC 可以输出一个完全预处理的 C++ 源文件。
我的问题是,我能否以某种方式获得一个部分预处理的 C++ 源文件,其中
a) 排除不满足#if、#ifdef 和#ifndef 条件的代码片段,
b) #include 指令被解析(包括头文件),等等
但是
c) 普通的#define 指令没有解析?
(这将是必要的并且非常有用,因为我希望尽可能获得最紧凑和可读的输出。 解析#if 指令会缩短源代码,但解析#define 指令会降低源代码的可读性和冗余性。)
我试图创建一个尽可能紧凑的示例,以展示我想要实现的目标:
示例输入文件:
// header1.h
#ifndef header1_h
#define header1_h
int function1(int val) {
return val + MYCONST;
}
#endif
// header2.h
#ifndef header2_h
#define header2_h
int function1(int val) {
return val + val + MYCONST;
}
#endif
// main.c
#define MYCONST 1234
#define SETTING1
#ifdef SETTING1
#include "header1.h"
#endif
#ifdef SETTING2
#include "header2.h"
#endif
int main(void) {
int retVal = function1(99);
}
预期输出:
// main.i (GCC preprocessing output)
#define MYCONST 1234 // I would like to see the definition of MYCONST here
#define SETTING1
#define header1_h
int function1(int val) {
return val + MYCONST; // I would like to see MYCONST here instead of the resolved value
}
int main(void) {
int retVal = function1(99);
}
【问题讨论】:
-
"Resolving"
#include指令会在你的文件中添加一个 lot。而对于系统头文件,您大多不会使用或不想阅读其中的大部分内容。 -
您可以尝试使用 Boost.Wave 或类似的独立 PP 实现作为解决方案的起点。
-
但是 (c) 和 (a) 可能相互依赖。
-
@RichardCritten 其实也是 (b),因为宏可用于包含。
标签: c++ gcc c-preprocessor