为GCC运行“轻型”预处理器

有没有办法运行GCC预处理器,但仅适用于用户定义的宏?

我有一些单行和一些#ifdef等条件,我想看看我的代码在扩展时的样子。

实际上,包括扩展,我的fprintf(stderr)变成fprintf(((__getreeent())->_stderr)等。

直接调用cpp ,例如

 $ cat >foo.c <" # 1 "" # 1 "foo.c" foo is defined 

当然,如果您包含任何标题,那么这些标题将包含在输出中。 避免这种情况的一种方法可能是使用#include s(或者只是使用#include <和允许#include "那些) grep -v out。或者你可以指定-nostdinc选项来删除标准包含(但是可能会留在本地库中,除非你指定包含路径以便找不到它们 - 但这会警告缺少标题。

编辑:或者使用预处理器本身使头部包含条件,将它们包装在#ifndef TESTING_PREPROCESSOR并使用-DTESTING_PREPROCESSOR

 cpp -nostdinc program.c 

可以使用unifdef,unifdefall等工具 – 从代码中删除预处理器条件

 gcc -E inputfile.c > outputfile.c 

outputfile.c将包含您的预处理代码,但所有宏都将被扩展。

在调试包含大量包含,编译器标志和makefile变量的大型系统的编译时,我发现这个技巧非常有用。 它将公开包含没有标题保护的文件,以及一堆其他问题。