有没有办法运行GCC预处理器,但仅适用于用户定义的宏?
我有一些单行和一些 #ifdef 等条件,我想看看我的代码在扩展时的样子 .
#ifdef
实际上,包括扩展,我的 fprintf(stderr) 转为 fprintf(((__getreeent())->_stderr) 等 .
fprintf(stderr)
fprintf(((__getreeent())->_stderr)
gcc -E inputfile.c > outputfile.c
outputfile.c将包含您的预处理代码,但所有宏都将被扩展 .
在调试包含大量包含,编译器标志和makefile变量的大型系统的编译时,我发现这个技巧非常有用 . 它将公开包含没有 Headers 保护的文件,以及一堆其他问题 .
直接致电 cpp ,例如
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
当然,如果您包含任何 Headers ,那么这些 Headers 将包含在输出中 . 避免这种情况的一种方法可能就是使用 #include (或者只是 #include < 并允许 #include " ) . 或者您可以指定 -nostdinc 选项以仅删除标准包含(但可能留在本地库中,除非您指定包含路径以便找不到它们) - 但这会警告缺少 Headers .
#include
#include <
#include "
-nostdinc
编辑:或者使用预处理器本身使头部包含条件,将它们包装在类似 #ifndef TESTING_PREPROCESSOR 的内容中并使用 -DTESTING_PREPROCESSOR .
#ifndef TESTING_PREPROCESSOR
-DTESTING_PREPROCESSOR
cpp -nostdinc program.c
可以使用unifdef,unifdefall等工具 - 从代码中删除预处理器条件
4 回答
outputfile.c将包含您的预处理代码,但所有宏都将被扩展 .
在调试包含大量包含,编译器标志和makefile变量的大型系统的编译时,我发现这个技巧非常有用 . 它将公开包含没有 Headers 保护的文件,以及一堆其他问题 .
直接致电
cpp
,例如当然,如果您包含任何 Headers ,那么这些 Headers 将包含在输出中 . 避免这种情况的一种方法可能就是使用
#include
(或者只是#include <
并允许#include "
) . 或者您可以指定-nostdinc
选项以仅删除标准包含(但可能留在本地库中,除非您指定包含路径以便找不到它们) - 但这会警告缺少 Headers .编辑:或者使用预处理器本身使头部包含条件,将它们包装在类似
#ifndef TESTING_PREPROCESSOR
的内容中并使用-DTESTING_PREPROCESSOR
.可以使用unifdef,unifdefall等工具 - 从代码中删除预处理器条件