【问题标题】:Preprocessor output预处理器输出
【发布时间】:2011-04-14 03:46:40
【问题描述】:

如何查看 C 预处理器在转换为目标文件之前生成的输出?

我想看看宏定义对我的代码做了什么。

【问题讨论】:

    标签: gcc macros c-preprocessor


    【解决方案1】:
    gcc -E file.c
    

    g++ -E file.cpp
    

    将为您执行此操作。 -E 开关强制编译器在预处理阶段结束后停止,将目前得到的所有内容输出到标准输出。

    注意:当然你必须有一些#include 指令。包含的文件也经过预处理,因此您可能会获得大量输出。

    对于 Visual C++,开关是 /E,它将预处理器输出吐到屏幕上。

    【讨论】:

    • gcc -E -nostdinc 将绕过标准的#include 文件
    • 如果您正在处理的文件没有标准 c 扩展名,您可能还需要指定 -x c
    • 您可能需要指定-I-D 开关。
    • -P 标志将禁止生成线标记。
    【解决方案2】:

    您也可以直接调用 C 预处理器。

    cpp infile outfile
    

    查看man cpp 了解更多信息。

    【讨论】:

    • 不错!我更喜欢这个而不是cc -E。另外,我也使用-P 禁用线市场(也适用于cc)。
    【解决方案3】:

    对于 GCC,

    gcc -E -dM file.c
    

    g++ -E -dM file.cpp
    

    应该做的工作。 -dM,作为 GNU 预处理器手册puts it,应该为在预处理器执行期间定义的所有宏生成一个“#define”指令列表,包括预定义的宏。

    【讨论】:

      【解决方案4】:

      这取决于您使用的编译器。
      使用 GCC,您可以在命令行上指定 -E 标志,让编译器生成预处理器输出。

      【讨论】:

        【解决方案5】:

        您可以查看我在此处描述的脚本:

        http://mosermichael.github.io/cstuff/all/projects/2011/09/16/preprocessor.html

        它将预处理器输出格式化为(希望)可读的 html 文档:由于预处理器而不同的行在文件中被标记。

        【讨论】:

          【解决方案6】:

          如果使用 Jetbrains 的 CLion,您可以使用操作“clangd: Preprocess current TU”

          所以点击shift shift 并开始输入clangd...

          最好将其分配给快捷方式,以便在首选项中更简单地重用->键盘映射:

          大声告诉marcosbento

          PS:TU 的意思是“翻译单元”(见此处LLVM translation unit

          【讨论】:

            猜你喜欢
            • 2011-08-21
            • 2021-03-19
            • 1970-01-01
            • 1970-01-01
            • 2011-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多