【问题标题】:What is a C++ module purview?什么是 C++ 模块权限?
【发布时间】:2018-03-10 00:39:37
【问题描述】:

我在 C++ 模块的上下文中看到了一些对“权限”一词的引用,例如在https://gcc.gnu.org/wiki/cxx-modules

Baz (); // Baz's declaration visible from purview Quux interface

究竟什么是 C++ 模块权限?

【问题讨论】:

    标签: c++ c++20 terminology c++-modules


    【解决方案1】:

    让我们把这个问题分成三个部分:

    1. 什么是 C++ 模块?
    2. 什么是权限?
    3. 什么是 C++ 模块的权限?

    C++ 模块

    模块是 C++ 的未来功能,目前不是语言标准的一部分(即不在C++17 中)。简而言之,模块旨在允许您导入已解析/编译的 C++ 结构,而不是将头文件文本添加到您的翻译单元(这是我们目前所做的,使用 #include 预处理器指令)。包含大量标题文本的文本是导致 C++ 编译缓慢的部分原因。如果我们可以一次编译大部分“头”代码,知道它为我们提供了什么,并让编译器记住这一点(以“模块”的形式),我们可以告诉编译器我们正在使用来自某些模块的东西,而不是包括很多标题。

    术语“权限”

    这是一个主要用于法律语言的英语术语,这就是为什么我们很多人(母语不是英语)从未听过它的原因。好吧,让我们在(Merriam-Webster)字典中查找它:

    权限,名词。 :


    1. (a) 法规的主体或制定部分
      (b) 法规的限制、目的或范围
    2. 权限、能力、责任、关注或意图的范围或限制
    3. 视野、理解或认知范围

    所以,基本上,“X 的权限”=“X 涵盖或包含的内容”。

    C++ 模块的权限

    现在让我们看看C++ Modules Technical Specification draft(它指定了建议的模块功能)。这将解释什么是模块的权限:

    模块单元权限从模块声明开始并延伸到翻译单元的末尾。命名模块 M 的权限是 M 的模块单元的模块单元权限的集合。

    当您编写模块声明时,您从模块未涵盖的声明开始(例如来自其他地方的声明),然后“开始”指定模块的导出,然后列出涵盖的声明/定义按模块。

    例子:

    // module interface of module M
    int f();
    export module M;
    int g();
    export int h();
    

    int g()int h() 属于“模块的权限”,但int f() 不在。

    在这个例子中只有一个“模块单元”;如果我们有额外的文件/翻译单元,它们在export module M之后的相关内容也将在权限范围内。


    注意:C++20 最终引入了一种称为“全局模块片段”的 hack。无需讨论details,只要说它出现在export module 语句之前就足够了。它的内容,以及其中包含#included 的任何内容,也在模块的范围之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      相关资源
      最近更新 更多