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