C++编译过程: Place for templates

标签 c++ templates compilation

我正在研究C++的编译过程。通过阅读this SO post我已经开始深入挖掘。首先,预处理器完成它的工作并解析所有预处理器指令。在我的 g++ 实现 (GNU) 上,#import <iostream>扩展到超过 18k 行的源代码。

然而,上述帖子跳转解释了 C++ 的语法验证过程,即编译阶段,将纯 C++ 代码转换为依赖于体系结构的汇编语言。

但是,在这个翻译步骤之前,我仍然看到许多模板化的定义。在转换为汇编之前,是否有一个步骤会实例化所有模板?

我知道我可以指示 g++ 只执行预处理(-E 选项),但是我可以指示 g++ 获取纯 C++ 文件,没有任何预处理指令,并生成一个包含所有模板解析的 C++ 文件吗?

最佳答案

Is there a step, prior to the translation to assembly, in where all of the templates are resolved?

不,没有这样的单独步骤。模板代码可以而且确实依赖于非模板代码,反之亦然,因此它们被一起处理。模板代码也没有指定在 C++ 标准中具有任何类型的等效非模板代码。尽管可以想出这种模板到非模板代码的等效性,但现代编译器通常将模板直接转换为某种内部表示,而不是非模板源代码。

这与预处理器代码形成对比,预处理器代码永远不会依赖于非预处理器代码,并且总是精确定义到非预处理器代码的转换。该翻译被标准指定为整个程序翻译过程中的概念性步骤之一。编译器通常将此概念步骤作为实际的翻译步骤来实现。

关于C++编译过程: Place for templates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53333436/

相关文章:

c++ - 我在自学C++,并在代码中陷入了计时器。尝试在上一条消息之后3秒发出一条消息

c++ - 未调用复制构造函数的虚拟辅助函数

C++ 从模板迭代器创建 vector

wordpress - 使*所有* WordPress 类别使用其父类别模板

compilation - 同时使用 TypeScript 和 Traceur 有什么优势?

C++ header 和未定义引用

c - Visual Studio 2019 : Cannot change Runtime Library : Error "Element <RuntimeLibrary> has an invalid value of/MDd "

c++ - 在 C++Builder 中显示 #include 层次结构

c++ - Windows-7/64 位上的免注册 COM 对象

templates - 使用 Modernizr 的网站/网页模板?