什么是C++模块权限?

20

我在C++模块的上下文中看到了一些关于“范围”的参考资料,例如在https://gcc.gnu.org/wiki/cxx-modules中:

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

C++ 模块域(purview)到底是什么?

1个回答

32

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

  1. 什么是C++模块?
  2. 什么是范围?
  3. C++模块的范围是什么?

C++模块

模块是C++的一个潜在未来特性,目前不是语言标准的一部分(即不在C++17中)。简而言之,模块旨在允许您导入已解析/编译的C++构造,而不是在翻译单元中文本地预先添加头文件(这是我们目前使用的方法,使用#include预处理器指令)。大量头文件的文本包含是导致C++编译缓慢的原因之一;如果我们可以只编译大部分“头”代码一次,并知道它提供给我们什么,然后让编译器记住这些信息(以“模块”的形式),我们就可以告诉编译器我们正在使用某些模块的内容,而不是包含许多头文件。

术语“范围”

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

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

因此,“X 的 purview”=“X 包含或涵盖的内容”。

C++ 模块的 purview

现在让我们来看一下C++模块技术规范草案(这是指定所提议的模块特性的规范)。这将解释模块的 purview 是什么:

模块单元 purview 从模块声明开始,延伸到翻译单元的结尾。命名模块 M 的 purview 是 M 的模块单元的集合。

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

例如:

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

int g()int h()在“模块的视野”内,但int f()不在。

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


注:C++20最终引入了一种称为“全局模块片段”的黑科技。不详细展开细节,简单来说,它出现在export module语句之前。其中的内容以及任何#include进去的内容也都在模块的视野之外。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接