我在 C++ 模块的上下文中看到了一些对“权限”一词的引用,例如在https://gcc.gnu.org/wiki/cxx-modules中:
Baz (); // Baz's declaration visible from purview Quux interface
C++ 模块权限到底是什么?
我在 C++ 模块的上下文中看到了一些对“权限”一词的引用,例如在https://gcc.gnu.org/wiki/cxx-modules中:
Baz (); // Baz's declaration visible from purview Quux interface
C++ 模块权限到底是什么?
让我们把这个问题分成三个部分:
模块是 C++ 的未来功能,目前不是语言标准的一部分(即不在C++17中)。简而言之,模块旨在允许您导入已解析/编译的 C++ 结构,而不是将头文件文本添加到您的翻译单元(这是我们目前使用#include
预处理器指令所做的)。包含大量标题文本的文本是导致 C++ 编译缓慢的部分原因。如果我们可以一次编译大部分“头”代码,知道它为我们提供了什么,并让编译器记住这一点(以“模块”的形式),我们可以告诉编译器我们正在使用来自某些模块的东西,而不是包括很多标题。
这是一个主要用于法律语言的英语术语,这就是为什么我们很多人(母语不是英语)从未听过它的原因。好吧,让我们在(Merriam-Webster)字典中查找它:
权限_ :
(a) 法规的主体或颁布部分
(b) 法规的限制、目的或范围- 权力、能力、责任、关注或意图的范围或限度
- 视野、理解或认知的范围
因此,基本上,“X 的权限”=“X 涵盖或包含的内容”。
现在让我们看一下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
也在模块的范围之外。