Include-Guard
# Include-Guard

Der Include-Guard oder Include-Wächter ist eine Programmiertechnik, um in C und C++ das Problem der mehrfachen Einbindung zu lösen.

Dieses Problem tritt auf, wenn innerhalb einer Übersetzungseinheit mehrmals die gleiche Header-Datei eingebunden wird. Das geschieht in der Regel unbeabsichtigt, z. B. wenn mehrere Module die gleiche Bibliothek benutzen.

## Beispiel einer Mehrfacheinbindung

Gegeben seien die folgenden beiden Header-Dateien A.h und B.h, die u. a. jeweils eine Klasse definieren:

Im Hauptprogramm sollen nun sowohl die Klasse A als auch B genutzt werden:

Das Programm lässt sich nicht fehlerfrei kompilieren, weil die Klasse A doppelt definiert wird: Die erste Definition erfolgt beim Einbinden der Header-Datei A.h in Zeile 2. Die zweite Definition erfolgt, weil die Header-Datei B.h, die in Zeile 3 eingebunden wird, selbst wiederum A.h einbindet. Die Klasse (und ggf. weitere Variablen) aus dieser Datei wurden bereits zuvor definiert, was zu einem Fehler der Kompilierung führt.

## Lösung mit Präprozessor-Makros (#ifndef)

Der #ifndef-Wrapper ist der traditionelle und C-konforme Ansatz. Das Problem der Mehrfacheinbindung wird durch Definition eines eindeutigen Präprozessor-Makros beim ersten Einbinden der Header-Datei gelöst. War das Makro bereits definiert, werden die nachfolgenden Definitionen des Headers übersprungen:

Die obenstehenden Präprozessor-Befehle bewirken, dass beim erstmaligen Einbinden von A.h (aus program.cpp) das Makro A_H noch nicht definiert ist und der Präprozessor die Definitionen durchläuft. Beim zweiten Einbinden (aus B.h) ist das Makro bereits definiert und der Präprozessor überspringt den Block #ifndef … #endif.

Da Makros im globalen Namensraum existieren, kann es hier zu Problemen kommen, wenn versucht wird, den gleichen Namen an anderer Stelle zu verwenden (sog. namespace pollution). Dem kann durch die Festlegung von Namenskonventionen zwar vorgebeugt werden, es löst das Problem dennoch nicht. Für compiler-eigene Definitionen und Definitionen in den Standard-Bibliotheken sind Bezeichner mit führendem Unterstrich (_) reserviert. Ein führender Unterstrich darf nach den aktuellen C- und C++-Standards daher nicht im Applikationscode verwendet werden.

Der CPP, der Präprozessor der GCC, erkennt solche Konstrukte automatisch, merkt sich die entsprechenden Dateien und überspringt diese bei nochmaligem Einbinden.

## Lösung über Spracherweiterungen (#pragma once)

Die meisten gebräuchlichen C- und C++-Compiler unterstützen heute die Spracherweiterung #pragma once. Diese sorgt ebenfalls dafür, dass eine (Header-)Datei nur einmal eingebunden wird, setzt jedoch auf höherer Ebene, direkt am Präprozessor, an und führt auch keine Makros in den globalen Namensraum ein.

Zur Verwendung genügt es, innerhalb der Header-Datei die Präprozessordirektive #pragma once einzufügen:

Diese Spracherweiterung wird von den folgenden C++-Implementierungen unterstützt:

* GCC,
* Clang,
* Microsoft Visual C++,
* Intel C++ Compiler,
* Comeau C/C++,
* C++Builder XE3,
* Digital Mars C++.
