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

时间:2009-01-20 12:26:54

标签: c++ templates macros compiler-construction

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

有什么想法吗?

5 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:9)

编译器实际上没有进行任何宏扩展。这是预处理器的任务。这一切都显示为一步,但编译器实际上会分配给单独的预处理器任务并为您捕获输出。

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

另一方面,

模板被编译。这有多个阶段。例如,名称被解析两次。在任一阶段,编译器都会存储名称查找的结果。那是一个表格。你会如何以文本形式表明?对此没有简单的C ++表达式。