【问题标题】:Run a "light" preprocessor for GCC为 GCC 运行“轻量级”预处理器
【发布时间】:2011-02-06 15:20:56
【问题描述】:

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

我有一些单行语句和一些#ifdef 等条件语句,我想看看我的代码在扩展这些语句后的样子。

事实上,包含扩展,我的fprintf(stderr)s 变成了fprintf(((__getreeent())->_stderr),等等。

【问题讨论】:

    标签: c gcc macros c-preprocessor


    【解决方案1】:

    直接拨打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 &lt; 并允许#include " 的行分开)。或者您可以指定 -nostdinc 选项以仅删除标准包含(但可能保留在本地库中,除非您指定包含路径以便找不到它们) - 但是这会警告缺少标头。

    编辑:或者使用预处理器本身使包含标头有条件,将它们包装在#ifndef TESTING_PREPROCESSOR 之类的东西中并使用-DTESTING_PREPROCESSOR

    【讨论】:

    • +1 - 将#include 行放在#if 部分中的提示是那些简单而有效的事情之一,直到浪费了一堆其他努力尝试其他更复杂的事情。
    【解决方案2】:
    cpp -nostdinc program.c
    

    【讨论】:

      【解决方案3】:
      gcc  -E inputfile.c > outputfile.c
      

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

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

      【讨论】:

      • 这不只是运行预处理器的标准方式吗?这如何回答这个问题?据推测,OP 想要一种非标准的行为(?)。
      • 这是标准方式。如果您的程序大量使用用户定义的宏,而使用非用户定义的宏,那么用户定义的宏将很容易被发现。通过运行 inputfile.c 和 outputfile.c 的差异。在许多情况下, gcc -E 已经足够好了,尽管在检测“仅”用户定义的宏方面绝对是完美的。而且它比使用其他答案中描述的完美方法要快得多。
      【解决方案4】:

      人们可以使用诸如 unifdef、unifdefall 之类的工具——从代码中删除预处理器条件

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          • 2014-09-13
          • 2011-04-24
          • 1970-01-01
          • 2014-06-14
          • 2021-11-27
          相关资源
          最近更新 更多