我正在研究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/