一、模块接口文件
1.定义和扩展名
模块接口文件定义了模块所提供功能的接口。这些文件通常具有 .cppm 扩展名。模块接口以声明文件定义了某个名称的模块开始,这被称为模块声明。模块的名称可以是任何有效的 C++ 标识符。名称可以包含点,但不能以点开头或结尾,也不能连续包含多个点。有效名称的示例包括 datamodel、mycompany.datamodel、mycompany.datamodel.core、datamodel_core 等。
注意:目前,还没有为模块接口文件标准化的扩展名。然而,大多数编译器支持 .cppm(C++ 模块)扩展名,这也是本书所使用的。请检查你的编译器文档,了解应使用哪种扩展名。
2.导出与模块接口
模块需要明确声明要导出什么,即客户端代码导入模块时应该可见的内容。从模块导出实体(例如,类、函数、常量、其他模块等)是通过 export 关键字完成的。模块中未导出的任何内容只在模块内部可见。所有导出实体的集合称为模块接口。
以下是一个名为 Person.cppm 的模块接口文件示例,定义了一个 person 模块并导出了一个 Person 类。注意它导入了 提供的功能。
export module person; // 模块声明
import ; // 导入声明
export class Person // 导出声明
{
public:
Person(std::string firstName, std::string lastName)
: m_firstName { std::move(firstName) }, m_lastName { std::move(lastName) } { }
const std::string& getFirstName() const { return m_firstName; }
const std::string& getLastName() const { return m_lastName; }
private:
std::string m_firstName;
std::string m_lastName;
};
3.使用模块
这个 Person 类可以通过导入 person 模块在以下代码中使用(test.cpp):
import person; // 导入 person 模块声明
import ;
import ; // 用于 std::string 的 operator