Einmaliges Einbinden von Dateien

Da es aufgrund von Verschachtelungen passieren kann, dass eine Header-Datei durch den Preprozessor mehrfach eingebunden wird, muss ein Mechanismus existieren, damit die darin enthaltenen Definitionen nicht doppelt kompiliert werden, was in Already defined oder Redefinition of-Fehlern resultieren würde. Üblicherweise wird dies mit folgendem Konstrukt gelöst:

#ifndef NAME_OF_FILE_INCLUDED
#define NAME_OF_FILE_INCLUDED

// Code

#endif //NAME_OF_FILE_INCLUDED

Details

Dieses Konstrukt bettet den eigentlichen Code in eine bedingte Compilierung ein. Die Bedingung für die Compilierung ist erfüllt, wenn das verwendete Makro noch nicht definiert wurde. Beim erstmaligen Compilieren dieses Konstruktes ist diese Bedingung erfüllt und das Makros wird sogleich definiert. Üblicherweise wird es ohne Zuordnung definiert, es kann aber auch einen Wert zugewiesen bekommen, für dieses Konstrukt spielt dies keine Rolle, da nur auf die Existenz des Makros geprüft wird. Beim nächsten Mal, wenn diese Datei compiliert wird, ist das Makro definiert, und die gesamten Definitionen werden übersprungen.

Der Name der Konstante ist beliebig, widerspiegelt jedoch nach allgemeinem Bewusstsein den Inhalt der Datei, was oftmals mittels des Dateinamens erreicht wird. Einige automatische Tools fügen dieser Konstante oftmals noch eine eindeutige Zahl hinzu, um jegliche Möglichkeit auszuschliessen, dass das Makro irgendwo anders schon definiert wurde. Der zusätzliche Kommentar in der #endif-Zeile ist optional, wird jedoch häufig gesehen.

Bei einigen Compilern kann als Lösung für dieses Problem auch die #pragma-Direktive eingesetzt werden, sie ist jedoch nicht für jeden Compiler gültig und wird daher nicht empfohlen.

Anstelle der #ifndef-Direktive in der ersten Zeile kann auch folgende Zeile geschrieben werden:

#if !defined NAME_OF_FILE_INCLUDED
#define NAME_OF_FILE_INCLUDED

// Code

#endif //NAME_OF_FILE_INCLUDED

Allerdings ist die Verwendung des defined-Operators bei diesem Konstrukt nicht sehr verbreitet, alleine schon wegen der Lesbarkeit.

Der Versuch, das ganze Konstrukt selbst als Makro zu definieren, scheitert, da Makros keine Direktiven enthalten können. Zudem versteht jeder die obigen Beispiele, wohingegen eine eigene Konstruktion erst nachgeschlagen werden muss.