C++ module编程升级指南,子模块与分区全解析

子模块

1.C++ 标准与子模块

C++ 标准并没有特别提到子模块,但允许在模块名称中使用点(.),从而可以按任何你想要的层次结构来组织模块。例如,以下是一个 DataModel 命名空间的示例:

export module datamodel;
import ;
export namespace DataModel {
class Person { /* ... */ };
class Address { /* ... */ };
using Persons = std::vector;
}

Person 和 Address 类都在 DataModel 命名空间内,也在 datamodel 模块中。可以通过定义两个子模块来重构:datamodel.person 和 datamodel.address。

2.子模块的模块接口文件

datamodel.person 子模块的模块接口文件如下:

export module datamodel.person; // datamodel.person 子模块
export namespace DataModel {
class Person { /* ... */ };
}

datamodel.address 子模块的模块接口文件如下:

export module datamodel.address; // datamodel.address 子模块
export namespace DataModel {
class Address { /* ... */ };
}

最后,定义一个 datamodel 模块如下。它导入并立即导出两个子模块。

export module datamodel; // datamodel 模块
export import datamodel.person; // 导入并导出 person 子模块
export import datamodel.address; // 导入并导出 address 子模块
import ;
export namespace DataModel {
using Persons = std::vector;
}

当然,子模块中类的方法实现也可以放在模块实现文件中。例如,假设 Address 类有一个默认构造函数,仅打印一条语句到标准输出;该实现可以放在一个名为 datamodel.address.cpp 的文件中:

module datamodel.address; // datamodel.address 子模块
import ;
using namespace std;
DataModel::Address::Address() {
cout