【问题标题】:C++ header unit importation syntaxC++ 标头单元导入语法
【发布时间】:2019-12-29 03:18:35
【问题描述】:

在当前的 C++ 草案(2019 年 8 月)中,pp-importhttp://eel.is/c++draft/cpp.import#nt:pp-import) 的语法允许在 header-nameheader-name-tokens 之后添加额外的 pp-tokens

该部分的当前版本是P1703: "Recognizing Header Unit Imports Requires Full Preprocessing" 的结果。在此提案引起的更改之前,语法仍然允许在header-nameheader-name-tokens 之后预处理令牌 令牌,但采用pp-import-suffix 的形式。 (P1103 的 [cpp.module] 部分)。

在这种情况下允许额外的、未使用的预处理令牌背后的原因是什么?

谢谢。

【问题讨论】:

标签: c++ language-lawyer c++20 c++-modules


【解决方案1】:

他们在那里允许属性。

第 7 阶段(解析和语义分析)语法没有改变。导入时仍允许使用属性。以前,第 4 阶段(预处理器)语法试图限制更多允许作为导入的内容,以强制执行以下规则:

只有当翻译阶段 4 产生的标记序列直到导入标记形成导入序列,并且导入标记不在 header-name-tokens 或 pp-import- 中时,才会识别 pp-import。另一个 pp-import 的后缀。

新规则进一步限制了它,每行不允许多次导入,因此不再需要此规则及其相关语法。

【讨论】:

  • 所以在第 4 阶段,没有检查 header-name 后面的内容是否实际上是有效的属性语法?例如在这个阶段,import <foo> import + 123; 有效吗?
  • 感谢您的回答。我阅读了有关导入指令的更多信息,得出以下结论:包含import pp-tokens; 的行是预处理指令(如eel.is/c++draft/cpp#1 中所述),它应该首先由预处理器处理(如果它与前两个匹配) pp-import 非终端宏定义的生产规则应该被导入)。接下来,应该翻译(由编译器处理)同一行,即使它匹配前两个生产规则或第三个,对吗? [续]
  • 然而,作为预处理指令,它在翻译阶段4结束时被删除。因此它不能被翻译,对吧?再次感谢您。
  • @JohanBoulé 以同样的方式nothing but a miracle can save me now C++ 通过第 4 阶段,因为它包含有效的令牌。是否有意义稍后检查。
  • @MichaelSpencer 我对此进行了更多思考,我认为因为import 预处理令牌被import-keyword 预处理令牌取代,control-line 不能再被视为preprocessing directive,这意味着它不会在翻译阶段 4 结束时被删除。这是否正确,如果正确,这是 import-keyword 预处理令牌的唯一目的吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
相关资源
最近更新 更多