Code: Select all
.h
Code: Select all
.cpp
Code: Select all
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; Not supposed to be exposed
Vector::Vector(int s) : elem{new double[s]}, sz{s} {}
double& Vector::operator[](int i) { return elem[i]; }
int Vector::size() { return sz; }
- Wie verbirgt der Export in einer einzelnen Moduldatei tatsächlich die Implementierung vor Bibliotheksbenutzern?
- Wenn sich die Implementierung in derselben Datei wie die Schnittstelle befindet, können Benutzer (oder irgendein konsumierender Compiler) dann nicht alles durch einfaches Hinsehen „sehen“. in Moduldatei?
- Wann Beim Aufbau einer dynamischen Bibliothek (z. B. .dll oder .so) verlassen wir uns normalerweise auf Header-Dateien (), um dem Client-Code die Funktionssignaturen mitzuteilen. Benötigen wir bei Modulen immer noch eine separate „Header-äquivalente“ Datei oder übernimmt die Modulschnittstelle diese Rolle vollständig?
Code: Select all
.h
Ergänzung:
Ich habe die ausführlichen Antworten unter „Was genau sind?“ bereits gelesen C++-Module?“ in denen erläutert wird, wie Module auf hoher Ebene funktionieren, wie sie sich von Includes unterscheiden usw. Allerdings bin ich immer noch verwirrt über ein bestimmtes Szenario: wenn ich alles (sowohl die öffentliche Schnittstelle als auch die private Implementierung) in einem einzigen Modul platziere Datei, wie verstecke ich eigentlich meinen privaten Code vor Clients, während ich menschliche Entwickler über seine Funktionssignatur, Deklaration usw. benachrichtige? Wird nicht immer noch eine textbasierte Header-Datei benötigt? Mir geht es insbesondere um die praktische Verbreitung einer Closed-Source-Bibliothek.