繁体   English   中英

为 GCC 运行“轻量级”预处理器

[英]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

如果你只是想要宏扩展并跳过#include处理,你可以试试这个repo 它是原始pcpp 的一个分支。 我添加了一个--no-include选项来跳过#include指令的处理。 所有其他宏将根据您对pcpp的 marco 输入进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM