Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Template-Optionen

&pagelevel(5)&pagelevel

Die folgenden Optionen sind nur in den Modi C++ 2017, C++ 2020 und C++ V3 relevant, da im Cfront-C++-Modus keine Templates unterstützt werden.

-T none
-T auto
-T local
-T all

Diese Optionen steuern die Art der Instanziierung von Templates mit externer Linkage. Dazu zählen Funktions-Templates sowie Funktionen (nicht-statische und nicht-inline) und statische Variablen, die Elemente von Klassen-Templates sind. Im Folgenden werden diese Arten von Templates unter dem Begriff „Template-Einheiten“ zusammengefasst.

In allen Instanziierungsmodi generiert der Compiler pro Übersetzungseinheit alle Instanzen, die mit der expliziten Instanziierungsanweisung template declaration oder mit dem Instanziierungspragma #pragma instantiate template-einheit angefordert werden.

Die restlichen Template-Einheiten werden wie folgt instanziiert:

-T none
Außer den explizit angeforderten Instanzen werden sonst keine Instanzen generiert.

-T auto (Voreinstellung)
Die Instanziierung erfolgt über alle Übersetzungseinheiten hinweg durch einen Prälinker. Der Prälinker wird erst aktiviert, wenn mit dem CC-Kommando eine ausführbare Datei erzeugt wird oder wenn die Option -y (siehe "Optionen zur Auswahl von Übersetzungsphasen") angegeben wird. Beim Erzeugen einer vorgebundenen Objektdatei (Option -r ) erfolgen keine Instanziierungen durch den Prälinker. Das Prinzip der automatischen Instanziierung ist ausführlich im Abschnitt „Automatische Instanziierung“ dargestellt.

-T local
Die Instanziierungen werden pro Übersetzungseinheit durchgeführt. Es werden alle Template-Einheiten instanziiert, die in einer Übersetzungseinheit benutzt werden. Dabei generierte Funktionen haben interne Linkage. Dadurch wird ein sehr einfacher Mechanismus für den Einstieg in die Template-Programmierung zur Verfügung gestellt. Der Compiler instanziiert die Funktionen, die in jeder Übersetzungseinheit benötigt werden, als lokale Funktionen. Das Programm bindet sie und läuft korrekt ab. Durch diese Methode entsteht jedoch eine Vielzahl von Kopien der instanziierten Funktionen und ist daher für die Produktion nicht empfehlenswert. Dieser Modus ist aus den gleichen Gründen nicht geeignet, wenn eines der Templates static-Variablen enthält.

Achtung:

Das basic_string-Template enthält eine static-Variable, um die leere Zeichenkette darzustellen. Wenn Sie die Option -T local und aus der Bibliothek den Typ string verwenden, wird die leere Zeichenkette nicht mehr erkannt. Bitte vermeiden Sie diese Kombination, weil sie zu ernsthaften Problemen führen kann.

-T all
Die Instanziierungen werden pro Übersetzungseinheit durchgeführt. Es werden alle Template-Einheiten instanziiert, die in einer Übersetzungseinheit benutzt oder deklariert werden. Alle Elementfunktionen und statischen Variablen eines Klassen-Templates werden unabhängig davon instanziiert, ob sie benutzt werden oder nicht. Funktions-Templates werden auch dann instanziiert, wenn sie lediglich deklariert werden.

-T add_prelink_files,pl_file1[,pl_file2...]

Mithilfe dieser Option können Objekte und Bibliotheken angegeben werden, die bei der Bestimmung der zu generierenden Instanzen vom Prälinker in folgender Weise berücksichtigt werden:

pl_filei ist der Name einer Objektdatei (.o-Datei) oder einer statischen Bibliothek(.a-Datei).

  • Wenn eine Objektdatei oder Bibliothek pl_filei die Definition einer Funktion oder eines statischen Datenelements enthält, wird keine Instanz einer Template-Einheit generiert, die hierzu ein Duplikat ist.

  • Wenn eine Objektdatei oder Bibliothek pl_filei Instanzen für Template-Einheiten benötigt, werden diese Instanzen nicht generiert.

Problemstellung

Die Bibliotheken libX.a und libY.a enthalten Referenzen auf dieselben Template-Instanzen. Wenn die Objekte der beiden Bibliotheken jeweils mit der Option -y vorinstanziiert werden, entstehen Duplikate.

Dem Prälinker muss in solchen Fällen ein Hinweis gegeben werden, dass Symbole anderswo definiert sind und er deshalb keine Instanz generieren soll. Hierzu steht die Option -T add_prelink_files zur Verfügung.

Lösung

Zunächst werden die Objekte der Bibliothek libX.a mit der Option -y vorinstanziiert.

Anschließend werden die Objekte der Bibliothek libY.a vorinstanziiert. Dabei wird mit der Option -T add_prelink_files,libX.a bekanntgegeben, dass der Prälinker die Bibliothek libX.a berücksichtigen muss und keine Duplikate zu libX.a generiert.

-T max_iterations,n

Spezifiziert im automatischen Instanziierungsmodus (-T auto) die maximale Anzahl n der Prälinker-Durchläufe. Voreingestellt ist n = 30. Wenn für n der Wert 0 angegeben wird, ist die Anzahl der Prälinker-Durchläufe nicht limitiert.

-T etr_file_none
-T etr_file_all
-T etr_file_assigned

Diese Optionen steuern die Erstellung einer ETR-Datei datei.etr (ETR=Explicit Template Request) für die Anwendung der expliziten Template-Instanziierung (siehe dazu Abschnitt „Generieren von expliziten Template-Instanziierungsanweisungen (ETR-Dateien)“)

Achtung:

Die Optionen etr_file_all und etr_file_assigned werden ignoriert, falls sie zusammen mit den Präprozessor-Optionen -P / -E / -M benutzt werden.

-T etr_file_none
Diese Angabe ist Voreinstellung und unterdrückt die Ausgabe der Instanziierungs-Informationen.

-T etr_file_all
Hiermit werden alle möglichen Template-Informationen ausgegeben.

-T etr_file_assigned
Es werden nur die vom Prälinker zugewiesenen instanziierten Templates ausgegeben.

-T [no_]definition_list bzw. -T [no_]dl

Diese Option ermöglicht eine interne Kommunikation zwischen dem Frontend und dem Prälinker während der Rekompilierungsphase der automatischen Template-Instanziierung. Weitere Einzelheiten finden Sie im Abschnitt „Automatische Instanziierung“.

-K arg1[,arg2...]

Allgemeine Eingaberegeln zur -K-Option finden Sie auf "Aufruf-Syntax und allgemeine Regeln". Als Argumente arg zur Steuerung der Template-Instanziierung sind folgende Angaben möglich:

assign_local_only
no_assign_local_only

Diese Argumente legen fest, ob die Zuweisung von Instanziierungen nur lokal unterstützt wird. Ist -K assign_local_only gesetzt, gilt im Detail Folgendes:

  • Instanziierungen können nur Objektdateien zugewiesen werden, die sich im aktuellen Dateiverzeichnis befinden (lokale Dateien).

  • Instanziierungen können nur einer Objektdatei zugewiesen werden, wenn das aktuelle Dateiverzeichnis zum Zeitpunkt der Instanziierung dem aktuellen Dateiverzeichnis zum Übersetzungszeitpunkt entspricht.

Beispiel 


cd dir1          # Das aktuelle Dateiverzeichnis zum
CC -c test1.c    # Übersetzungszeitpunkt von test1.c ist dir1
cd ../dir2       # Das aktuelle Dateiverzeichnis zum
CC -c test2.c    # Übersetzungszeitpunkt von test2.c ist dir2 
cd ../dir1       # Das aktuelle Dateiverzeichnis für den Prälinker
                 # ist dir1
CC -K assign_local_only -o test test1.c ../dir2/test2.o

In diesem Beispiel ist die Zuweisung von Instanziierungen nur zur lokalen Objektdatei test1.o möglich.

-K no_assign_local_only ist voreingestellt.

implicit_include
no_implicit_include

Diese Argumente legen fest, ob die Definition eines Templates implizit inkludiert wird (siehe Abschnitt „Implizites Inkludieren“).

-K implicit_include ist voreingestellt.

instantiation_flags
no_instantiation_flags

-K instantiation_flags ist voreingestellt und bewirkt, dass spezielle Symbole generiert werden, die vom Prälinker bei der automatischen Instanziierung genutzt werden.
Bei Angabe von -K no_instantiation_flags werden diese Symbole nicht generiert, wodurch sich die Objektgröße reduziert. Eine automatische Instanziierung mit -T auto ist dann nicht möglich.