2

阶段 7:分隔标记的空白字符不再重要。每个预处理令牌都被转换为一个令牌。生成的标记在句法和语义上进行分析,并作为翻译单元进行翻译。

阶段 8:翻译后的翻译单元和实例化单元组合如下:检查每个翻译后的翻译单元以生成所需实例化的列表。找到所需模板的定义。是否需要包含这些定义的翻译单元的源是由实现定义的。执行所有必需的实例化以生成实例化单元。[注意:这些类似于翻译的翻译单元,但不包含对未实例化模板的引用和模板定义。— 尾注] 如果任何实例化失败,则程序是非良构的。

我删除了一些注释以缩短粘贴的文本。

为什么在 C++ 的编译阶段 8 中已经翻译了翻译单元之后,还要执行模板定位和实例化?考虑到两阶段名称查找,这些步骤不应该在第 7 阶段进行吗?

4

2 回答 2

0

我相信这部分与模板类型的预编译有关。任何模板化的类型都是“实例化单元”。如果模板化类型处于预编译状态,则需要在此阶段进行处理。

于 2012-09-30T21:38:43.603 回答
0

这是现已弃用的 导出模板功能的保留。导出模板允许将类和函数模板的定义与其声明分开(在适当的意义上)。

作为实现细节,将翻译单元翻译与模板实例化分开是有意义的,因为它可以减少实例化模板的冗余工作。然而,大多数当前编译器在翻译单元翻译时实例化所有模板,并在链接时消除重复实例化。

希望概念和模块将允许将来将类似的功能重新引入该语言。

于 2012-10-01T17:50:24.443 回答