首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++导入-关键字、模块关键字和导出关键字

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

Stack Overflow用户
提问于 2020-11-28 06:25:25
回答 1查看 609关注 0票数 1

引言

在C++标准草案中:

有提到这些术语import-keywordmodule-keyword和,export-keyword

混乱

在语法部分,我不太确定怎么会像A.1一般情况那样

“这里描述的语法接受一组有效的C++结构。”

这些语法似乎不是在附录中定义的。

问题

它可能是这里地址

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

但我不知道这在语法上意味着什么..。那是什么意思?

相关

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

代码语言:javascript
复制
 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 
代码语言:javascript
复制
 keyword:
    any identifier listed in Table 5
    import-keyword
    module-keyword
    export-keyword 
代码语言:javascript
复制
module-import-declaration:
    import-keyword module-name attribute-specifier-seqopt ;
    import-keyword module-partition attribute-specifier-seqopt ;
    import-keyword header-name attribute-specifier-seqopt ;
代码语言:javascript
复制
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
代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-28 14:49:54

你有所有的作品,只是看得不对。可能是因为“关键字”这个词。

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

因此,pp-import是一个预处理指令,非常类似于宏定义(就像module-file及其衍生物一样)。预处理器指令通常控制为C++生成的令牌序列,模块预处理器指令也没有不同。

第[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-keyword令牌。并且主C++语法识别import-keyword令牌,即使您不能为该令牌编写文本。

但是..。为什么?为什么你不能输入这些预处理指令和关键字呢?为什么不让importmodule像其他关键字一样工作呢?

有两个原因。

  1. “模块”和“导入”这两个词经常用作标识符。通过让预处理程序转换模块头和导入指令来使用非人工可写令牌module-keywordimport-keyword,这些指令之外的“模块”和“导入”的任何使用都允许它们只是标识符。因此,C++20不会破坏成堆的代码。 或者你宁愿写co_module ;)
  2. 在模块化构建系统中,您需要一种方法来查看文件,并快速了解它定义了哪些模块以及它导入了哪些模块。而且您不希望仅仅为了这样就编写一个完整的C++解析器,更不要说花时间在整个文本上运行它了(这将很困难,因为您需要导入所有这些模块才能理解它)。通过首先生成模块语句预处理器指令,而不仅仅是常规的C++语法,您可以简单地使用C++预处理程序来提取它们。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65047031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档