include blocker



  • Hallo,

    wenn man eine neue header Datei schreibt beginnt diese immer mit:
    #ifndef HEADER_H

    welchen sinn hat das nochmal ?

    Das eben diese header Datei nicht mehrmals eingebunden wird oder
    ein anderer der am Projekt mitarbeitet nicht eine header datei mit demselben Namen anlegt und der linker dann nicht weiß welche er nehmen soll ?

    Danke



  • Dass eben diese Header-Datei nicht mehrmals eingebunden wird 🙂



  • Ersteres:

    // header.h
    #ifndef FOO
    #define FOO
    
    void someFunc() {}
    
    #endif
    
    // main.cpp
    
    #include "header.h"    // Präprozessor ersetzt diese Zeile mit dem gesamten Inhalt von header.h
    
    ...
    
    #include "header.h"    // Präprozessor ... wie oben ;)
    

    Das ist der einfachste Fall, wie eine Datei doppelt in eine Übersetzungseinheit gelangen kann. Beim ersten include ist FOO noch nicht definiert, deshalb wird someFunc() erfolgreich "in die Übersetzungseinheit eingefügt". Beim zweiten include ist FOO bereits definiert, sodass someFunc() nicht redefiniert wird.


  • Administrator

    Es geht hierbei weder um den Linker noch um andere Mitarbeiter. Der Header Guard (nicht Blocker) dient dazu, dass man einen Header in einer TU mehrmals inkludieren kann, ohne die Gefahr einer Mehrfachdefinition befürchten zu müssen. Es geht hier also um ein Hilfsmittel, um die One-Definition-Rule (ODR) zu gewährleisten.

    Einfachstes Beispiel:
    header.hpp

    #ifndef MY_HEADER_GUARD_WITH_CRYPTIC_NUMBER_0342521341
    
    #ifdef USE_HEADER_GUARDS // Hilfsmittel für das Beispiel
    #  define MY_HEADER_GUARD_WITH_CRYPTIC_NUMBER_0342521341
    #endif
    
    struct MyStruct
    {
    };
    
    #endif // MY_HEADER_GUARD_WITH_CRYPTIC_NUMBER_0342521341
    

    tu.cpp

    #define USE_HEADER_GUARDS // (1)
    
    #include "header.hpp"
    #include "header.hpp"
    
    int main()
    {
      return 0;
    }
    

    Dieser Code wird kompilieren. Wenn du die mit (1) markierte Zeile auskommentierst, wird der Code nicht mehr kompilieren.
    (Code ist ungetestet)

    Grüssli



  • @Dravere: Was aber wenn noch andere Studenten, die an der gleichen Uni studieren, zufällig den gleichen Header-Guard verwenden? Das wäre ja dann extrem doof. Und wieso gilt das nur für TUs und nicht für alle Unis? Ich schnalls nicht... 😕



  • FHler machen solche Fehler nicht.


  • Administrator

    hustbaer schrieb:

    @Dravere: Was aber wenn noch andere Studenten, die an der gleichen Uni studieren, zufällig den gleichen Header-Guard verwenden? Das wäre ja dann extrem doof. Und wieso gilt das nur für TUs und nicht für alle Unis? Ich schnalls nicht... 😕

    LoL, jetzt habe ich echt zuerst einfach nur hingegafft und gedacht: WTF? (allerdings in Schweizerdeutsch *g*)
    Ich sollte wohl weniger Abkürzungen verwenden, hast recht. Erst recht bei einem Anfänger, der weiss wohl nicht, dass TU die Abkürzung für Translation Unit ist und daher meistens in C++ ein *.cpp File bezeichnet.

    (ich bin jetzt davon ausgegangen, dass dein Satz ironisch ist und du weisst, was TU bezeichnet. Falls dies nicht der Fall ist, das "Anfänger" nicht auf dich beziehen. ;))

    Grüssli


Anmelden zum Antworten