C ++编译过程:放置模板的地方

时间:2018-11-16 07:43:33

标签: c++ templates compilation

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

但是,前面提到的文章跳转来解释C ++的语法验证过程,即编译阶段,该过程将纯C ++代码转换为依赖于体系结构的汇编语言。

但是,在此翻译步骤之前,我仍然看到许多模板化定义。在转换为程序集之前,是否有步骤将所有模板实例化?

我知道我可以指示g ++仅执行预处理(-E选项),但是然后我可以指示g ++提取纯C ++文件,而没有任何预处理指令,并生成一个解析了所有模板的C ++文件吗? / p>

1 个答案:

答案 0 :(得分:1)

  

在翻译成程序集之前,是否有步骤解决所有模板?

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

这与预处理器代码相反,预处理器代码从不依赖于非预处理器代码,并且始终具有对非预处理器代码的精确定义的转换。该翻译被标准指定为整个程序翻译过程中的概念步骤之一。编译器通常将此概念步骤作为实际翻译步骤来实现。