Das implizite Inkludieren von Quelldateien ist eine Methode, um Definitionen von Template-Einheiten zu finden. Diese Methode ist beim Compiler voreingestellt (siehe auch Option-K implicit_include
, "Template-Optionen") und kann mit -K no_implicit_include
ausgeschaltet werden. Zum Ausschalten der impliziten Inkludierung beachten Sie bitte auch die Hinweise im Abschnitt "Grundlegende Aspekte".
Wenn implizites Inkludieren eingeschaltet ist, sucht der Compiler die Definition zu einer Template-Einheit nach folgendem Prinzip: Wenn eine Template-Einheit in einer Include-Datei basisname .h
deklariert ist und im übersetzten Quellcode keine Definition bereitsteht, nimmt der Compiler an, dass die Definition zu dieser Template-Einheit in einer Quelldatei steht, die den Basisnamen der Include-Datei und einen passenden Suffix enthält (z.B. basisname .C
).
Es sei beispielsweise eine Template-Einheit ABC::f
in der Include-Datei xyz.h
deklariert. Wenn die Instanziierung von ABC::f
bei der Übersetzung angefordert wird, aber keine Definition von ABC::f
im übersetzten Quellcode existiert, sucht der Compiler in dem Verzeichnis, in dem die Include-Datei steht, nach einer Quelldatei mit dem Basisnamen xyz
und einem passenden Suffix (z.B. xyz.C
). Wenn sie existiert, wird sie so behandelt, als ob sie am Ende der Quelldatei inkludiert wäre.
Es werden die folgenden Suffixe in dieser Reihenfolge geprüft: c, C, cpp, CPP, cxx, CXX, cc, CC, c++ und C++. Das sind die Suffixe, die per Default als C++-Source interpretiert werden. Die Option -Y F
hat keine Auswirkung auf die beim impliziten Inkludieren geprüften Suffixe.
Damit beim Instanziieren die Datei gefunden wird, in der die Definition einer bestimmten Template-Einheit steht, muss der vollständige Pfadname der Datei bekannt sein, in der die Deklaration des Templates steht. Diese Information ist in Dateien, die #line
-Anweisungen enthalten, nicht verfügbar. In diesem Fall ist implizites Inkludieren nicht möglich.
Implizites Inkludieren und make
-Mechanismus
Wenn Sie mit dem make
-Mechanismus arbeiten, müssen die implizit inkludierten Teile bei der Generierung der Dateiabhängigkeitszeilen berücksichtigt werden. Die Objektdatei hängt also sowohl von explizit inkludierten Include-Dateien als auch von implizit inkludierten Dateien mit Template-Definitionen ab.
Wenn Sie die -M
-Option benutzen, werden die impliziten Include-Teile im automatischen Instanziierungsmodus nur dann berücksichtigt, wenn die Instanziierungs-Informationsdateien korrekt erzeugt worden sind.
Folgende Arbeitsschritte sind dazu notwendig:
Alle Quelldateien übersetzen.
Das Programm binden, so dass alle Instanziierungen zugewiesen sind.
Die Dateiabhängigkeitszeilen für das Programm
make
mit der Option-M
erzeugen (siehe auch "Optionen zur Auswahl von Übersetzungsphasen").Die Schritte 2 und 3 wiederholen, wenn sich die generierten Template-Instanzen geändert haben.