12

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

有什么想法吗?

4

5 回答 5

10

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

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

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

于 2009-01-20T12:32:07.260 回答
10

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

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

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

于 2009-01-20T12:40:26.260 回答
5

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

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

于 2009-01-20T12:44:51.167 回答
2

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

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

于 2009-01-20T12:34:49.300 回答
1

It's easy to add an option to compilers to show the output after macro substitution. That's defined as a simple text substitution option anyway. Many compilers implement this as a separate stage, sometimes even handled as a separate tool. In any case, the result of the macro substitution is a collection of Translation Units in text form.

Templates, on the other hand, are compiled. There are multiple stages to this. Names are resolved twice, for instance. In either stage, the compiler would store the result of the name lookup. That's a table entry. How would you show that in text form? There's no trivial C++ expression for that.

于 2009-01-22T14:49:52.443 回答