#include-Direktive

Die wohl am häufigsten gebrauchte Direktive des Preprozessors. Mittels dieser Direktive werden explizit Dateien an der angegebenen Stelle in den Programmcode eingefügt. Der Inhalt der eingefügten Datei wird daraufhin ebenfalls geparst. Im folgenden Beispiel wird eine selbst hergestellte Datei header1.h in eine andere Datei mit der #include-Direktive eingefügt. Für selbst geschriebene Dateien werden Anführungs- und Schlusszeichen "" verwendet. Die Ausgabe der zweiten Datei zeigt, was der Preprozessor generiert.



end of file 1

// This is file "header2.h"
// This is file "header1.h"
#define PI 3.14
// Including file finished.
// This is file "header1.h"
#define PI 3.14
---------------------------

// This is file "header2.h"
#include "header1.h"
// Including file finished.

Mit der #include-Direktive werden auch die Standardbibliotheken in den Programmcode eingefügt, hierbei werden jedoch die grösser- und kleiner-Klammern <> verwendet:




Hello World!
#include <stdio.h>

int main(){
  printf("Hello World!\n");
  return 0;
}

Details

Die grösser- und kleiner-Klammern <> weisen den Preprozessor an, nach der angegebenen Datei in bestimmten Suchpfaden zu suchen, die vom System her bekannt sind. Dies beinhaltet insbesondere die Standard-Bibliotheken sowie möglicherweise dem System hinzugefügte Bibliotheken. Der Preprozessor sucht jedoch nicht im Verzeichnis des Sourcecodes, weswegen selbst hergestellte Dateien nicht mit grösser- und kleiner-Klammern inkludiert werden sollten (Versuche haben allerdings ergeben, dass die Dateien trotzdem gefunden werden, was aber dennoch nicht empfehlenswert ist).

Um selbst hergestellte Dateien mittels der #include-Direktive einzufügen, werden die Anführungs- und Schlusszeichen "" benötigt. Diese weisen den Preprozessor an, zuerst im Verzeichnis der aktuellen Datei zu suchen. Wenn die Datei nicht gefunden wird, wird in dem explizit angegebenen Suchpfad (beispielsweise auch mit relativer Verzeichnisangabe "../mainheader.h") gesucht. Wenn die Datei dann immer noch nicht gefunden wird, wird nochmals eine Suche gestartet, welche an denselben Orten sucht, wie wenn die Datei mit grösser- und kleiner-Klammern angegeben worden wäre.

Findet der Preprozessor eine Datei nicht, so gibt er einen No such file or directory-Fehler aus.

Unterscheidung Header-Datei und Bibliothek

Das Einbinden mittels der #include-Direktive wird oftmals fälschlicherweise als das Einbinden der dazugehörigen Bibliothek bezeichnet oder verstanden. Tatsächlich wird jedoch durch die #include-Direktive nur eine Text-Datei in den bestehenden Source-Code eingefügt. Dies ist normalerweise eine Header-Datei und dient als Interface (API) zur dazugehörigen Bibliothek.

Die Bibliothek selbst jedoch liegt normalerweise als vorcompilierte Objekt-Datei vor und wird erst beim Linken mit dem compilierten Source-Code verbunden. Wenn die vorcompilierte Bibliothek nicht auffindbar ist, so entsteht ein Linkerfehler. Wenn die Bibliothek zudem nicht statisch während des Linkens in das fertige Programm eingebunden wird, sondern als dynamische Bibliothek referenziert wird, kann es passieren, dass ein Programm auf dem einem Computer läuft, auf einem anderen jedoch nicht, da dort die entsprechende dynamische Bibliothek nicht gefunden werden kann. So entstehen die berühmten missing DLL-Fehler.

Im alltäglichen Programmieren spielt jedoch die Betrachtung und Unterscheidung von statischen und dynamischen Bibliotheken sowie deren Header-Dateien nicht so eine grosse Rolle. Dementsprechend wird auf ManderC der Begriff Bibliothek dem Begriff Bibliotheks-Header-Datei vorgezogen. Der Konsistenz halber wird jedoch bei der Angabe einer entsprechenden Header-Datei auf das .h verzichtet, da dieses zudem unter C++ nicht mehr verwendet wird.