为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变量的大型系统的编译时,我发现这个技巧非常有用。 它将公开包含没有标题保护的文件,以及一堆其他问题。