查看编译器扩展代码 - C++

问题描述 投票:0回答:5

我了解到编译器在编译时会扩展宏。模板也会在编译时扩展。有什么办法可以看到这个扩展的代码吗?我正在使用 Visual Studio 2008 进行编译。

有什么想法吗?

c++ visual-studio templates macros
5个回答
11
投票

编译器实际上并不执行任何宏扩展。 这就是预处理器的任务。 这一切看起来都是一个步骤,但编译器实际上会分叉出一个单独的预处理器任务并为您捕获输出。

模板在编译时不会“扩展”。 它们在编译期间使用时被实例化。 不同之处在于编译器立即为模板生成目标代码;没有中间源代码出来。 您无法将实例化的模板代码视为源代码,它会在需要时作为程序集转储出来。

如果您有 GCC,您还可以使用带有正确参数的“cpp”直接调用预处理器(主要包括路径和命令行宏定义)。 其他人已经回答了 MSVC。


10
投票

VC++ 编译器 (cl.exe) 为此支持一些命令行开关:

/E preprocess to stdout
/P preprocess to file
/EP preproscess to stdout with no #lines

可以在项目属性中添加其他命令行开关。在我的版本(VC2005)中,配置选项 -> C/C++ -> 命令行 -> 其他选项


5
投票

注意 VC++ 中的 /E 仅扩展预处理器语句(即#include、#ifdef、#define 等)

我不知道有任何现代编译器允许扩展模板。


2
投票

要发出预处理后的代码,请直接调用cpp或在gcc及相关编译器中使用-E选项;我确信其他编译器或套件也有类似的东西(事实上,根据其他答案,它是 VC++ 中的 /E 或 /P)。

不确定是否输出实例化模板。我认为这更难做到,因为它实际上是编译的一部分而不是预处理的一部分(至少在现代编译器中,因为原始的 cfront 版本是一个 c++ 到 c 的翻译器,如果我没记错的话)。


1
投票

向编译器添加一个选项以显示宏替换后的输出很容易。无论如何,这被定义为一个简单的文本替换选项。许多编译器将其作为一个单独的阶段来实现,有时甚至作为一个单独的工具来处理。无论如何,宏替换的结果都是文本形式的翻译单元的集合。

另一方面,模板是经过编译的。这有多个阶段。例如,名称会被解析两次。在任一阶段,编译器都会存储名称查找的结果。这是一个表项。您将如何以文本形式展示这一点?没有简单的 C++ 表达式可以实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.