C++ 导入关键字、模块关键字和导出关键字

Dav*_*ger 2 c++ language-lawyer c++20

介绍

在C++标准草案中:

其中提到了这些术语import-keywordmodule-keywordexport-keyword

困惑

在语法部分,我不太确定按照A.1 概述如何可能

“此处描述的语法接受有效 C++ 结构的超集。”

本附录中似乎没有定义这些语法。

问题

可以在这里解决

4 在 pp-import 的所有三种形式中,导入和导出(如果存在)预处理标记分​​别替换为 import-keyword 和 export-keyword 预处理标记。

但我真的不知道这在语法方面意味着什么......这是什么意思?

有关的

一些相关的语法在这里(希望我可以帮助某人获得必要的信息,而不必遍历标准)。

 preprocessing-token:
    header-name
    import-keyword
    module-keyword
    export-keyword
    identifier
    pp-number
    character-literal
    user-defined-character-literal
    string-literal
    user-defined-string-literal
    preprocessing-op-or-punc
    each non-whitespace character that cannot be one of the above 
Run Code Online (Sandbox Code Playgroud)
 keyword:
    any identifier listed in Table 5
    import-keyword
    module-keyword
    export-keyword 
Run Code Online (Sandbox Code Playgroud)
module-import-declaration:
    import-keyword module-name attribute-specifier-seqopt ;
    import-keyword module-partition attribute-specifier-seqopt ;
    import-keyword header-name attribute-specifier-seqopt ;
Run Code Online (Sandbox Code Playgroud)
control-line:
    # include pp-tokens new-line pp-import
    # define identifier replacement-list new-line
    # define identifier lparen identifier-listopt ) replacement-list new-line
    # define identifier lparen ... ) replacement-list new-line
Run Code Online (Sandbox Code Playgroud)
pp-import:
    exportopt import header-name pp-tokensopt ; new-line
    exportopt import header-name-tokens pp-tokensopt ; new-line
    exportopt import pp-tokens ; new-line
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

你已经拥有了所有的部分;你只是没有正确地看待它。可能是因为“关键字”这个词。

所以让我们从pp-importis 不属于语法的一部分开始。这本身并不是真正的 C++ 语法;而是 C++ 语法。它以“pp”开头,因为它是预处理器的一部分。预处理器是在 C++ 语法的其余部分应用于文本之前发生的事情。

预处理器指令pp-import也是如此,很像宏定义(按原样及其派生词)。预处理器指令通常控制为 C++ 生成的标记序列,模块预处理器指令也不例外。module-file

[cpp.import] 部分定义了它的pp-import外观以及它生成的令牌。因此,在预处理之前,您将得到一个如下所示的文本序列:import "some_module.name"。当预处理器将此文本识别为 时pp-import,它将生成标记序列, import-keyword "some_module.name"

import-keyword是特定令牌的名称,就像ifstruct。但与大多数此类标记不同,该标记没有文本模拟。也就是说,if是编译器在代码中看到文本“if”时生成的关键字。情况并非如此import-keyword。该标记仅由 C++ 预处理器生成,并且仅来自pp-import预处理指令生成。

因此,预处理指令pp-import基本上用标记替换了“导入”文本import-keywordimport-keyword即使您无法编写该标记的文本,主要的 C++ 语法也会识别该标记。

但为什么?为什么所有这些繁琐的预处理指令和关键字您都无法输入?为什么不像其他关键字一样makeimport和work 呢?module

有两个原因。

  1. “模块”和“导入”这两个词经常用作标识符。通过让预处理器转换模块头和 import 指令以使用非人类可写标记module-keyword和,在这些指令之外import-keyword使用“module”和“import”都允许它们只是标识符。因此,C++20 不会破坏大量代码。

    或者你宁愿写co_module;)

  2. 在模块化构建系统中,您需要一种方法来查看文件并快速了解它定义的模块以及导入的模块。而且您宁愿不必编写整个 C++ 解析器来做到这一点,更不用说花时间在整个文本上运行它(这将很困难,因为您需要导入所有这些模块才能理解它)。通过首先将模块语句设为预处理器指令,而不仅仅是常规的 C++ 语法,您可以简单地使用 C++ 预处理器来提取它们。

  • @DavidLedger:如果它破坏了你的代码,那是“故意的”,因为你可能做了一些会破坏我列表中的第 2 项的事情。有很多方法可以使关键字上下文相关;他们选择这种基于预处理器的机制正是因为*它不是(常规)C++。 (2认同)