[英]Run a “light” preprocessor for GCC
有没有办法运行GCC预处理器,但仅适用于用户定义的宏?
我有一些单行代码和一些#ifdef
等条件,我想看看我的代码在扩展它们时是什么样子。
事实上,包含得到扩展,我的fprintf(stderr)
变成了fprintf(((__getreeent())->_stderr)
等等。
直接调用cpp
,例如
$ cat >foo.c <<EOF
#define FOO
#ifdef FOO
foo is defined
#else
foo is not defined
#endif
EOF
$ cpp foo.c
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.c"
foo is defined
当然,如果您包含任何标题,那么这些标题将包含在输出中。 避免这种情况的一种方法可能是使用grep -v
用#include
s(或者可能只是带有#include <
并允许#include "
)。或者您可以指定-nostdinc
选项以仅删除标准包含(但可能会留在本地库中,除非您指定包含路径以便它们不会被找到)——不过,这会警告缺少头文件。
编辑:或者使用预处理器本身来包含头文件,将它们包装在#ifndef TESTING_PREPROCESSOR
类的东西中并使用-DTESTING_PREPROCESSOR
。
可以使用像 unifdef、unifdefall 这样的工具——从代码中删除预处理器条件
cpp -nostdinc program.c
gcc -E inputfile.c > outputfile.c
outputfile.c 将包含您的预处理代码,但所有宏都将被扩展。
我发现这个技巧在调试包含大量包含、编译器标志和 makefile 变量的大型系统的编译时非常有用。 它会暴露没有标题保护的包含文件,以及一堆其他问题。
如果只需要宏扩展并跳过#include
处理,则可能会有所帮助: https : //github.com/ned14/pcpp/pull/34
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.