19

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

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

C++ 模块权限到底是什么?

4

1 回答 1

29

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

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

C++ 模块

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

“权限”一词

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

权限_ :


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

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

C++ 模块的范围

现在让我们看一下C++ 模块技术规范草案(它指定了提议的模块功能)。这将解释模块的权限是什么:

模块单元权限从模块声明开始并延伸到翻译单元的末尾。命名模块 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。无需详细说明它,只要说它出现在export module声明之前就足够了。它的内容,以及其中包含的任何内容,#include也在模块的范围之外。

于 2018-03-10T01:04:14.367 回答