什么是C++模块权限?

2022-05-16 00:00:00 terminology c++ c++20 c++-modules

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

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

什么是C++模块权限?


解决方案

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

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

C++模块

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

术语权限

这是一个主要在法律语言中使用的英语术语,这就是为什么我们很多人(母语不是英语)从来没有听说过它。好吧,让我们查一下(韦氏词典):

权限,编号:


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

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

C++模块的权限

现在让我们来看看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最终引入了一种称为全局模块片段的黑客攻击。无需深入讨论details,只要说它出现在export module语句之前就足够了。其内容以及#included中的任何内容也不在该模块的权限范围内。

相关文章