cor*_*697 3 c++ c++20 c++-modules
我正在尝试学习 C++20 功能附带的模块的概念。SubModule 和 ModulePartition 的概念让我很困惑。它们基本上都完成相同的工作,但我无法决定何时、在什么条件下使用哪一个。
你能准确地向我解释一下其中的区别吗?
“子模块”和模块分区之间的区别很简单:
子模块不作为模块系统的一部分存在。模块分区是模块系统的一部分。
模块分区是模块的一个组件,可以由本身就是模块组件的其他文件导入。这允许它们用于多个模块实现单元使用的私有声明,或者用于将大型模块的接口拆分为不同的文件,以便您的单个主模块接口单元不会太大。
分区实际上是命名空间范围模块的一种方式。该分区X:Y只能由属于 module 一部分的模块单元访问X。的主模块接口X确实可能是export import一个分区,但外界并不知道这些声明位于 的分区的权限范围内X。
在模块的模块单元内,您可以通过将其命名为 来X导入该模块的分区。也就是说,因为 的 模块单元 唯一可以访问的分区是 的分区,因此无需重复。Y:YXX
“子模块”不是模块系统的一部分;它是一种思考和处理特定模块的方式。按照惯例,人们使用命名约定X.Y来表示它Y是X. 但这纯粹是一种约定;它没有语法合法性。也就是说,该语言不知道该模块X.Y与X(X可以export import X.Y;,但没有要求这样做)
就语言而言,被视为子模块的模块仍然是具有所有权力和限制的成熟模块。它的名称没有特殊含义,并且您不能以任何有意义的身份将此类模块设为“私有”。
子模块(又名:只是另一个模块)根本不与正确的分区“执行相同的工作”。子模块对于外界来说与它们在概念上是“子模块”的模块完全一样可见。
模块分区的要点是它们是实现细节模块的它们不会泄漏到模块的接口中。子模块可以。也许这就是你想要的。
但请记住这一点:与标头不同,包含模块的成本并不取决于该模块中有多少内容。因此,将库的接口分解为一堆微小的子模块并没有多大意义(这可能就是 C++ 委员会将整个标准库放入单个模块std而不是数十个较小模块的原因)。将接口定义在多个文件中很有用,但外界不必看到它们。您选择如何组织代码应该考虑到您的便利性,而不是用户如何与其交互。
因此模块分区。
如果您想要做的是提供库的多个组件作为不同的可导入单元,那么子模块就是实现这一目标的工具。但是,如果您只是在模块内组织代码,并且外部代码不需要了解该组织,那么这就是分区的用途。