运行一个";“轻”;GCC预处理器

运行一个";“轻”;GCC预处理器,c,gcc,macros,c-preprocessor,C,Gcc,Macros,C Preprocessor,是否有一种方法可以运行预处理器,但只针对用户定义的宏 我有一些单行程序和一些#ifdef等条件,我想看看我的代码在展开时是什么样子的 事实上,扩展了include,我的fprintf(stderr)s变成fprintf(((((() $ 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 "&

是否有一种方法可以运行预处理器,但只针对用户定义的宏

我有一些单行程序和一些
#ifdef
等条件,我想看看我的代码在展开时是什么样子的


事实上,扩展了include,我的
fprintf(stderr)
s变成
fprintf(((((()

$ 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
$cat>foo.c
c将有您的预处理代码,但所有宏都将展开


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

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

+1的marco输入进行处理-放置
#include>的提示#if
部分中的代码>行是那些简单但有效的事情之一,在尝试其他更复杂的事情之前,可能不会发生在某人身上。这难道不是运行预处理器的标准方式吗?这如何回答问题?大概OP想要一种非标准行为(?)。这是标准方法。如果您的程序大量使用用户定义的宏,而较少使用非用户定义的宏,那么用户定义的宏将很容易被发现。通过运行inputfile.c和outputfile.c的差异。在许多情况下,gcc-E已经足够好了,尽管在检测“仅”方面绝对完美用户定义的宏。它比使用其他答案中描述的完美方法快得多。
cpp -nostdinc program.c
gcc  -E inputfile.c > outputfile.c