kennen:module
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:module [2020-07-29 17:32] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Module ====== | ||
+ | |||
+ | ===== Abschied vom Präprozessor? | ||
+ | |||
+ | Programme bestehen aus mehreren [[translation_units]], | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | int main() | ||
+ | { | ||
+ | std::cout << " | ||
+ | } | ||
+ | </ | ||
+ | Das Einbinden anderer Quellen per '' | ||
+ | |||
+ | ===== Module importieren ===== | ||
+ | |||
+ | Übersetzungseinheiten können Module importieren und nutzen: | ||
+ | |||
+ | <code cpp> | ||
+ | import hello; | ||
+ | int main() | ||
+ | { | ||
+ | greeting(); | ||
+ | } | ||
+ | </ | ||
+ | Importierbar sind (übergangsweise? | ||
+ | |||
+ | ===== Schnittstelle ===== | ||
+ | |||
+ | Ein Modul besteht aus genau einer Modul-Schnittstellen-Datei und null bis vielen Implementierungsdateien. Kennzeichen einer Modulschnittstelle ist die Anweisung '' | ||
+ | |||
+ | <code cpp> | ||
+ | export module hello; | ||
+ | export void greeting(); | ||
+ | </ | ||
+ | In der Schnittstelle werden alle zum Modul gehörenden und vom Modul exportierbaren Namen aufgeführt. Das Schlüsselwort '' | ||
+ | |||
+ | ===== Implementierung ===== | ||
+ | |||
+ | Funktionen werden in der Modulschnittstelle oder anderen zum Modul gehörenden Dateien definiert: | ||
+ | |||
+ | <code cpp> | ||
+ | module hello; | ||
+ | import < | ||
+ | void greeting() { std::cout < " | ||
+ | </ | ||
+ | Die Zugehörigkeit zu einem Modul wird durch '' | ||
+ | |||
+ | ===== Reexportieren ===== | ||
+ | |||
+ | <code cpp> | ||
+ | export module noodles; | ||
+ | export import spaghetti; | ||
+ | ... | ||
+ | </ | ||
+ | erlaubt, die Schnittstellen anderer Module mit zu exportieren. | ||
+ | |||
+ | ===== Partitionen ===== | ||
+ | |||
+ | <code cpp> | ||
+ | export module geometry: | ||
+ | ... | ||
+ | </ | ||
+ | Modulpartitionen, | ||
+ | |||
+ | <code cpp> | ||
+ | export module geometry; | ||
+ | export import :vector; | ||
+ | </ | ||
+ | Auch Modulpartitionen können neben der Schnittstelle weitere Implementierungsdateien besitzen. | ||
+ | |||
+ | ===== Globales und privates Fragment ===== | ||
+ | Eine Modul(schnittstellen)datei hat zwingend folgende Struktur (Teile in Eckigen Klammern können wegfallen): | ||
+ | <code cpp> | ||
+ | [ // nur Kommentare | ||
+ | module; | ||
+ | ... ] // nur Präprozessoranweisungen | ||
+ | [export] modul modulname; | ||
+ | [export][import andere; | ||
+ | ... // Modulbereich | ||
+ | [module : | ||
+ | ... ] | ||
+ | </ | ||
+ | Eine Modulschnittstelle mit privatem Modulbereich darf keine weiteren Implementierungsdateien haben. | ||
+ | ===== Modul-Bindung ===== | ||
+ | |||
+ | Neben lokaler und externer Bindung führt das Modulsystem eine weitere Bindungsart ein. Innerhalb von Modulschnittstellen definierte Variablen sind innerhalb aller Übersetzungseinheiten des Moduls nutzbar. Mit anderen externen Variablen kollidieren sie nicht, wenn sie nicht exportiert werden, wie dieses Beispiel mit mehreren Modulpartitionen zeigt: | ||
+ | |||
+ | <code cpp> | ||
+ | export module walk: | ||
+ | int x = 0; | ||
+ | </ | ||
+ | <code cpp> | ||
+ | export module walk:steps; | ||
+ | import :position; | ||
+ | |||
+ | export void forward() { ++x; } | ||
+ | export void back() { --x; } | ||
+ | </ | ||
+ | <code cpp> | ||
+ | export module walk; | ||
+ | export import :steps; | ||
+ | import :position; | ||
+ | |||
+ | export auto get_position() { return x; } | ||
+ | </ | ||
+ | <code cpp> | ||
+ | // does not collide with x in module walk: | ||
+ | int x = 7; | ||
+ | </ | ||
+ | <code cpp> | ||
+ | import walk; | ||
+ | import std.core; // Visual C++ 2019: instead of | ||
+ | // import < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | forward(); | ||
+ | forward(); | ||
+ | back(); | ||
+ | std::cout << get_position() << " steps gone\n"; | ||
+ | |||
+ | extern int x; | ||
+ | std::cout << x << " is another, unaffected global variable\n"; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Übersetzungsprozess ===== | ||
+ | |||
+ | Modulschnittstellen als auch Implementierungsdateien sind einzelne Übersetzungseinheiten, | ||
+ | |||
+ | ^Übersetzungseinheit | ||
+ | |Modul-Schnittstelle | ||
+ | |Importierbare Header |'' | ||
+ | | | ||
+ | |Modul-Implementierung|'' | ||
+ | |Konsument | ||
+ | |||
+ | < | ||
+ | *.ixx -> Prepocess/ | ||
+ | v \ / | ||
+ | | ||
+ | v / | ||
+ | *.cpp -> Compile -> *.obj | ||
+ | </ | ||
kennen/module.txt · Zuletzt geändert: 2020-07-29 17:32 von 127.0.0.1