【发布时间】:2011-04-14 03:46:40
【问题描述】:
如何查看 C 预处理器在转换为目标文件之前生成的输出?
我想看看宏定义对我的代码做了什么。
【问题讨论】:
标签: gcc macros c-preprocessor
如何查看 C 预处理器在转换为目标文件之前生成的输出?
我想看看宏定义对我的代码做了什么。
【问题讨论】:
标签: gcc macros c-preprocessor
gcc -E file.c
或
g++ -E file.cpp
将为您执行此操作。 -E 开关强制编译器在预处理阶段结束后停止,将目前得到的所有内容输出到标准输出。
注意:当然你必须有一些#include 指令。包含的文件也经过预处理,因此您可能会获得大量输出。
对于 Visual C++,开关是 /E,它将预处理器输出吐到屏幕上。
【讨论】:
gcc -E -nostdinc 将绕过标准的#include 文件
-x c
-I 和-D 开关。
-P 标志将禁止生成线标记。
您也可以直接调用 C 预处理器。
cpp infile outfile
查看man cpp 了解更多信息。
【讨论】:
cc -E。另外,我也使用-P 禁用线市场(也适用于cc)。
对于 GCC,
gcc -E -dM file.c
或
g++ -E -dM file.cpp
应该做的工作。 -dM,作为 GNU 预处理器手册puts it,应该为在预处理器执行期间定义的所有宏生成一个“#define”指令列表,包括预定义的宏。
【讨论】:
这取决于您使用的编译器。
使用 GCC,您可以在命令行上指定 -E 标志,让编译器生成预处理器输出。
【讨论】:
您可以查看我在此处描述的脚本:
http://mosermichael.github.io/cstuff/all/projects/2011/09/16/preprocessor.html
它将预处理器输出格式化为(希望)可读的 html 文档:由于预处理器而不同的行在文件中被标记。
【讨论】:
如果使用 Jetbrains 的 CLion,您可以使用操作“clangd: Preprocess current TU”
所以点击shift shift 并开始输入clangd...
最好将其分配给快捷方式,以便在首选项中更简单地重用->键盘映射:
大声告诉marcosbento
PS:TU 的意思是“翻译单元”(见此处LLVM translation unit)
【讨论】: