Header- und C++-Dateien

Um ein Programm besser handhaben zu können, trennt man in C++ Deklarationen der Klassen von der sogenannten Definition bzw. Implementierung der einzelnen Methoden. Deklarationen kommen in die sogenannten Header-Dateien, der letztendliche Programmtext der Methoden in die C++-Dateien.

In einer Header-Datei steht also nur, was es gibt. In der C++-Datei ist durch konkrete Befehle ausformuliert, wie es ist.

Verwendet (eingebunden) werden die Header-Dateien durch eine Präprozessor-Direktive in der C++-Datei, dem #include Befehl, den es in zwei Versionen gibt:

// alles was in Datei abc.h im selben Verzeihnis
// steht, hier einfügen

#include "abc.h"

// alles was in Datei xyz.h im Suchpfad des Compilers
// steht, hier einfügen

#include <xyz.h>

Vor der Übersetzung des Programms durch den Compiler werden alle Dateien durch den Präprozessor gejagt und damit vorkompiliert. Der Präprozessor fügt anstelle des #include Befehls den Inhalt der angegebenen Datei eins zu eins an dieser Stelle ein. Das funktioniert in der Praxis auch mit anderen Dateien.

Der Befehl #include <iostream> aus den vorherigen Beispielen bindet also die Standard-Headerdatei der Ein- und Ausgabe ein, die gemäß der C++-Konvention als Sonderfall ohne Erweiterung .h geschrieben wird. Da diese Datei nicht in unserem Projektverzeichnis steht, sondern an anderer Stelle im System, werden eckige Klammern anstelle der doppelten Anführungszeichen gesetzt.

Einbinden von Header-Dateien

Eine Header-Datei lässt sich in mehrere C++-Dateien einbinden. Damit wird automatisch in all diesen C++-Dateien ein und dieselbe Deklaration verwendet. Die Deklaration stellt also eine gemeinsame Schnittstelle bereit, die für alle betreffenden C++-Dateien gilt. Implementiert wird die Funktionalität hinter der Deklaration nur ein einziges Mal, aber alle können auf die Implementierung über dieselbe Schnittstelle zugreifen.

Durch die Trennung von Deklaration (was gibt es) und Definition (wie sieht es konkret aus) in Header- und C++-Dateien wird der Programmtext in verschiedene Module aufgeteilt. Die Implementierung einer Klasse bleibt so von der Implementierung einer anderen Klasse unabhängig. Ändert sich die Implementierung einer Klasse, aber die Schnittstelle bleibt gleich, müssen nicht große Teile des Programms angepasst und neu übersetzt werden.

Diese Strategie des Versteckens von Informationen ist ein Grundprinzip, das sich durch die gesamte Sprache zieht. Verschiedene Teile eines Programms sollten so unabhängig voneinander wie möglich gehalten werden. Falls notwendig, können auf diese Weise Teile des Programms neu geschrieben werden, ohne dass sich eine kleine Änderung auf viele andere Programmteile auswirken.

zurück