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

C++ import-keyword, module-keyword and, export-keyword

简介

在C++标准草案中:

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

混乱

在语法部分,我不太确定按照 A.1 General

怎么可能

"the grammar described here accepts a superset of valid C++ constructs."

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

问题

可以解决here:

4 In all three forms of pp-import, the import and export (if it exists) preprocessing tokens are replaced by the import-keyword and export-keyword preprocessing tokens respectively.

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

相关

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

 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 
 keyword:
    any identifier listed in Table 5
    import-keyword
    module-keyword
    export-keyword 
module-import-declaration:
    import-keyword module-name attribute-specifier-seqopt ;
    import-keyword module-partition attribute-specifier-seqopt ;
    import-keyword header-name attribute-specifier-seqopt ;
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
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

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

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

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

Section [cpp.import] 定义了 pp-import 的样子以及它生成的标记。所以在预处理之前,您将得到一个看起来像这样的文本序列:import "some_module.name"。当预处理器将此文本识别为 pp-import 时,它将生成 标记序列 import-keyword "some_module.name".

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

所以预处理指令 pp-import 基本上用 import-keyword 标记替换了“导入”文本。并且主要的 C++ 语法识别 import-keyword 标记,即使您不能为该标记编写文本。

但是……为什么?为什么您无法输入所有这些繁琐的预处理指令和关键字?为什么不让 importmodule 像任何其他关键字一样工作?

有两个原因。

  1. “模块”和“导入”这两个词非常用作标识符。通过让预处理器转换模块 headers 和导入指令以使用 non-human-writable 标记 module-keywordimport-keyword,“模块”和“导入”的任何使用 这些指令的 outside 允许它们只是标识符。因此,C++20 不会破坏大量代码。

    或者你宁愿写 co_module ;)

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