C++20功能。在这本书中,他展示了export module
如何elimiNATINE传统的模式,必须将声明和定义定义为单独的标题(.h
)和源(.cpp
)文件
。在他的书中,他介绍了一个自制的
vector
班级模块,以解释他的观点:
export module Vector; // defining the module called "Vector"
export class Vector {
public:
Vector(int s);
double& operator[](int i);
int size();
private:
double* elem; // elem points to an array of sz doubles
int sz;
};
export bool operator==(const Vector& v1, const Vector& v2) {
if (v1.size() != v2.size())
return false;
for (int i = 0; i < v1.size(); ++i) {
if (v1[i] != v2[i])
return false;
}
return true;
}
//Implementations; Supposed to be hidden
Vector::Vector(int s) : elem{new double[s]}, sz{s} {}
double& Vector::operator[](int i) { return elem[i]; }
int Vector::size() { return sz; }
传统上,我们必须进行Separate标头文件以揭示功能签名(以便我们的图书馆的消费者知道如何调用它们)和
.cpp
文件以隐藏实现。ever,带有模块,看起来像是所有的文件都位于同一文件中。 my my
问题是:在单个模块文件中使用
export
实际上如何对库用户隐藏实现?如果实现与接口相同的文件中,难道不让用户(或任何消费编译器)通过简单地查看模块文件来“查看”所有内容? 要换句话说,如果我将所有内容(公共界面和私人实现都放在一个模块文件中),我该如何实际上从客户端删除我的私人代码声明等。不需要基于文本的标头文件吗?
我特别担心封闭源库的实际分发。我刚刚浏览了我的C ++库,包括Stroustrup的书籍。没有人提及隐藏实现详细信息是课程或模块的原因。我意识到这通常是原因,但它比真实更神话。这是在与C ++一起工作30多年之后。 模型完全说明了相反的情况。所有详细信息都存在于标题文件中。模板和非模板代码使用“实现指针”(PIMPL)技术隐藏实现。这再次掩盖了类是为了隐藏实施的想法,因为您必须努力使用此技术。 正常类的确隐藏了实现详细信息,因为成员定义可以在源文件中,并在标题中发表声明。这是次要效应,因为单独汇编的主要目的是提高编译速度。具有接口和实现文件的模块也是如此。 a库隐藏了实现详细信息,因为它具有接口的标头文件和用于实现的二进制文件。如果在单独的文件中完成实现,则模块将执行相同的操作。
重要的是要注意,“隐藏”通常是避免用户“取决于”实现的感觉,而不是必经可能避免可见的细节。 如果您需要一个模块,而没有逐字化的实现详细信息,则实际上您不能使用单个文件来放置封闭信息和接口。该解决方案针对不同的用例。
换句话说,您-May使用此功能,这也意味着您
-maynot使用它。