预处理器输出

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于预处理器输出的主要内容,如果未能解决你的问题,请参考以下文章

GCC 可选预处理器输出和编译一次通过

如何解释 C 预处理器输出中的 # 前缀行?

scikit learn Pipeline中的后处理分类器输出

预处理器指令

Inno Setup:将预处理器生成的输出文件名返回到批处理脚本

GCC 转储预处理器定义