Entwurf von C ++ - Modulen (Technische Spezifikation nach C ++ 17)
Ein Entwurf und mehrere aktualisierte Überarbeitungen für die C / C ++ - Modulspezifikation wurden von WG21 auf open-std.org veröffentlicht. Ich werde hier nur auf die neuesten Dokumente verlinken:
- Arbeitsentwurf, Erweiterungen von C ++ für Module N4610 (Oktober 2016).
- Vierte Revision veröffentlicht als P0142R0 (März 2016).
- Formulierung für Module veröffentlicht als P0143R2 (März 2016).
- Das Clang-Team hat eine zweite Überarbeitung seiner Änderungen veröffentlicht: P0273R1 (Oktober 2016).
Die folgenden Blog-Beiträge enthalten eine Zusammenfassung der Normungsbesprechungen und insbesondere eine Zusammenfassung des aktuellen Status des Modulentwurfs:
Update: Wie in dem oben verlinkten Kona-Reisebericht erläutert, gibt es derzeit zwei konkurrierende Vorschläge, einen von Microsoft und einen von Clang. Die vorgeschlagene Lösung von Microsoft erlaubt keinen Export von Makros, während die Lösung des Clang-Teams den Export von Makros unterstützen würde. Bisher hat nur Microsoft offiziell einen Entwurf für eine Modulspezifikation eingereicht.
Modulspezifikation wie von Microsoft vorgeschlagen
Hier finden Sie eine kurze Übersicht über die wichtigsten Konzepte, die dieser Vorschlag enthält. Da es sich um einen Entwurf handelt, könnte sich dies möglicherweise noch ändern. Der neue Modulstandard wird unter anderem aus Folgendem bestehen:
Ein module
Schlüsselwort zum Deklarieren eines Moduls. Mehrere Dateien können dies deklarieren, um ein Modul zu erstellen (aber für jedes Modul kann nur eine Kompilierungseinheit einen export {}
Abschnitt enthalten ):
module M;
Möglicherweise wird auch ein import
Schlüsselwort zum Importieren von Modulen import
verwendet using module
, sodass stattdessen ein neues Importschlüsselwort vermieden werden kann.
import std.io;
import module.submodule;
Eine export
Syntax, die die öffentlichen definiert Erklärungen , die Teil dieses Moduls, nicht-Schnittstelle sind Erklärungen , die nicht als Teil des Moduls ausgeführt werden sollte , wird außerhalb des Exportblock definiert werden. Deklarationen können jede Art von Deklaration in C / C ++ sein, dh nicht nur Funktionen, sondern auch Variablen, Strukturen, Vorlagen, Namespaces und Klassen:
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
Eine wichtige Änderung der Module besteht darin, dass Makros und Präprozessordefinitionen für Module lokal sind und nicht exportiert werden. Somit haben Makros keine Auswirkungen auf importierte Module:
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
Es ist wichtig zu beachten, dass sowohl das aktuelle Präprozessorsystem als auch die Module nebeneinander existieren können und Header weiterhin verwendet werden können, um beispielsweise Makros einzuschließen.
Für detailliertere Informationen empfehle ich, den Entwurf zu lesen.
Clang-Module
Clang hat an einer Modulimplementierung gearbeitet, die auf der Seite mit den Clang-Modulen zu finden ist . Derzeit implementiert clang jedoch keine konkrete Syntax für Module, dh keine der oben genannten Syntax wurde von Clang implementiert. Um dies zu erklären, enthält die Seite die folgende Anweisung:
Derzeit gibt es keine C- oder C ++ - Syntax für Importdeklarationen. Clang wird den Modulvorschlag im C ++ - Komitee verfolgen. Im Abschnitt Enthält als Importe finden Sie Informationen dazu, wie Module heute importiert werden.
Der Hauptteil, der derzeit von Clang implementiert wird, ist die "Module Map Language", mit der Modulzuordnungen für vorhandenen Code geschrieben werden können, der weiterhin Header-Dateien verwendet.
Makroexporte aus Modulen
Wie oben erwähnt, ist noch unklar, ob Makroexporte Teil der endgültigen Module TS sein werden . In P0273R1 wurde die folgende Syntax für den Export von Makros vorgeschlagen:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);