Sprachkonzepte Preprozessor Operatoren Kontrollstrukturen Typen OOP Bibliotheken |
Einmaliges Einbinden von DateienDa 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
DetailsDieses 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 Bei einigen Compilern sieht man als Lösung für dieses Problem auch eine Anwendung der #pragma-Direktive, sie ist jedoch nicht für jeden Compiler gültig und wird daher nicht empfohlen. Die Sprache Objective-C hat für dieses Problem eigens die #import-Direktive eingefügt, welche jedoch in C++ Programmen nichts zu suchen hat. Anstelle der #ifndef-Direktive in der ersten Zeile kann man auch folgende Zeile schreiben:
Allerdings ist die Verwendung des defined-Elements 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.
|