【发布时间】:2011-02-06 15:20:56
【问题描述】:
有没有办法运行GCC 预处理器,但仅适用于用户定义的宏?
我有一些单行语句和一些#ifdef 等条件语句,我想看看我的代码在扩展这些语句后的样子。
事实上,包含扩展,我的fprintf(stderr)s 变成了fprintf(((__getreeent())->_stderr),等等。
【问题讨论】:
标签: c gcc macros c-preprocessor
有没有办法运行GCC 预处理器,但仅适用于用户定义的宏?
我有一些单行语句和一些#ifdef 等条件语句,我想看看我的代码在扩展这些语句后的样子。
事实上,包含扩展,我的fprintf(stderr)s 变成了fprintf(((__getreeent())->_stderr),等等。
【问题讨论】:
标签: c gcc macros c-preprocessor
直接拨打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 与#includes(或者可能只是与#include < 并允许#include " 的行分开)。或者您可以指定 -nostdinc 选项以仅删除标准包含(但可能保留在本地库中,除非您指定包含路径以便找不到它们) - 但是这会警告缺少标头。
编辑:或者使用预处理器本身使包含标头有条件,将它们包装在#ifndef TESTING_PREPROCESSOR 之类的东西中并使用-DTESTING_PREPROCESSOR。
【讨论】:
#include 行放在#if 部分中的提示是那些简单而有效的事情之一,直到浪费了一堆其他努力尝试其他更复杂的事情。
cpp -nostdinc program.c
【讨论】:
gcc -E inputfile.c > outputfile.c
outputfile.c 将包含您的预处理代码,但所有宏都将被扩展。
当调试包含大量包含、编译器标志和 makefile 变量的大型系统的编译时,我发现这个技巧非常有用。它将暴露没有标头保护的包含文件,以及许多其他问题。
【讨论】:
人们可以使用诸如 unifdef、unifdefall 之类的工具——从代码中删除预处理器条件
【讨论】: