我在C++模块的上下文中看到了一些关于“范围”的参考资料,例如在https://gcc.gnu.org/wiki/cxx-modules中:
Baz (); // Baz's declaration visible from purview Quux interface
C++ 模块域(purview)到底是什么?
我在C++模块的上下文中看到了一些关于“范围”的参考资料,例如在https://gcc.gnu.org/wiki/cxx-modules中:
Baz (); // Baz's declaration visible from purview Quux interface
C++ 模块域(purview)到底是什么?
让我们将这个问题分成三个部分:
模块是C++的一个潜在未来特性,目前不是语言标准的一部分(即不在C++17中)。简而言之,模块旨在允许您导入已解析/编译的C++构造,而不是在翻译单元中文本地预先添加头文件(这是我们目前使用的方法,使用#include
预处理器指令)。大量头文件的文本包含是导致C++编译缓慢的原因之一;如果我们可以只编译大部分“头”代码一次,并知道它提供给我们什么,然后让编译器记住这些信息(以“模块”的形式),我们就可以告诉编译器我们正在使用某些模块的内容,而不是包含许多头文件。
这是一个英语术语,主要用于法律语言,这就是为什么我们(非英语母语者)中的许多人从未听说过它的原因。好吧,让我们在(Merriam-Webster)字典中查找一下:
purview, n. :因此,“X 的 purview”=“X 包含或涵盖的内容”。
现在让我们来看一下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
之后的相关内容也将在视野范围内。
export module
语句之前。其中的内容以及任何#include
进去的内容也都在模块的视野之外。