首页 文章

为GCC运行“轻型”预处理器

提问于
浏览
14

有没有办法运行GCC预处理器,但仅适用于用户定义的宏?

我有一些单行和一些 #ifdef 等条件,我想看看我的代码在扩展时的样子 .

实际上,包括扩展,我的 fprintf(stderr) 转为 fprintf(((__getreeent())->_stderr) 等 .

4 回答

  • 3
    gcc  -E inputfile.c > outputfile.c
    

    outputfile.c将包含您的预处理代码,但所有宏都将被扩展 .

    在调试包含大量包含,编译器标志和makefile变量的大型系统的编译时,我发现这个技巧非常有用 . 它将公开包含没有 Headers 保护的文件,以及一堆其他问题 .

  • 14

    直接致电 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 .

    编辑:或者使用预处理器本身使头部包含条件,将它们包装在类似 #ifndef TESTING_PREPROCESSOR 的内容中并使用 -DTESTING_PREPROCESSOR .

  • 1
    cpp -nostdinc program.c
    
  • 3

    可以使用unifdef,unifdefall等工具 - 从代码中删除预处理器条件

相关问题