使用GCC对C文件进行部分预处理(不删除“ define”指令)

如果我通过-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);
}
azssddd 回答:使用GCC对C文件进行部分预处理(不删除“ define”指令)

gcc的选项-fdirectives only可以满足您的需求:

  

-fdirectives-only

     

预处理时,请处理指令,但不要扩展宏。

     

该选项的行为取决于-E和-fpreprocessed选项。

     

使用-E,预处理仅限于处理#define,#ifdef和#error等指令。不执行其他预处理器操作,例如宏扩展和三字图转换。另外,-dD选项是隐式启用的。

     

通过-fpreprocessed,可禁用命令行和大多数内置宏的预定义。上下文相关的宏,例如__LINE__,通常会处理。这样可以编译以前用-E -fdirectives-only预处理过的文件。

     

同时使用-E和-fpreprocessed,-fpreprocessed的规则优先。这样可以对以前使用-E -fdirectives-only预处理过的文件进行完全预处理。

在您的情况下,应将其命名为

 % gcc -fdirectives-only -E -o main.i main.c

但是您得到的定义(内部定义的),空行和#line行比您要的要多。

本文链接:https://www.f2er.com/3122158.html

大家都在问