precompiled header



  • Guten Abend!

    Eine kleine Frage:
    Warum wird der include (#include precompiled.h) immer in die cpp dateien des Projektes geschrieben und nicht in die header dateien eines Projektes? Was ist, wenn ich Teile aus dem precompiled header bereits in den header dateien des projektes benötige?

    Vielen Dank.



  • Da die #include "precompiled.h" (bei MSVC++ oft "stdafx.h" ) als erste Präprozessoranweisung in der .cpp-Datei stehen, spielt das keine Rolle. Der Header selbst muss ja keinen Zugriff auf die vorkompilierte Datei haben, da er selbst nur indirekt (über .cpp-Dateien) kompiliert wird. Und in den .cpp-Dateien sind dann die Definitionen im vorkompilierten Header sowieso bekannt.

    Ich hoffe, das war jetzt nicht allzu verwirrend. 🙂



  • Ansonsten kannst du, wie es grundsätzlich besser ist die Klassen, die du brauchst (also für Referenzen, Zeiger, Rückgabewerte und Argumente) Vorwärts deklarieren, damit du die Abhängigkeiten noch ein wenig besser verringern kannst.



  • Ok danke.

    Ich verstehe aber folgendes noch nicht so ganz. Ein Beispiel:

    In precompiled.h steht folgendes:
    #include <map>

    In Test.h steht folgendes:

    private:
    map<int,int> mMap

    In Test.cpp steht am Anfang folgendes:
    #include precompiled.h
    und irgendwo anders:

    mMap[0]=0;
    mMap[1]=1;

    Warum brauch ich dann in Test.h kein #include <map>? Ich benötige es dort doch für die Deklaration??

    Danke vielmals und einen schönen Abend noch 🙂



  • Weil du in der test.cpp zuerst precompiled.h inkludierst und dann test.h. Sprich in deinem Kompilat befindet sich diese Definition nach der Definition von std::map.

    test.cpp:

    #include "precompiled.h" // <-- inkludiert ja <map>
    #include "test.h" // <-- kriegt jetzt von oben her die map
    
    ...
    


  • Du musst einfach dran denken, dass an der Stelle, wo ein #include steht, der gesamte Code des gewünschten Headers eingebunden wird. Nach dem Präprozessorvorgang gibt es also keine eigentlichen, von den .cpp-Dateien separierten Headerdateien mehr.



  • ok.

    Warum spricht man dabei eigentlich von definition? in den header dateien, die inkludiert werden, stehen doch meist nur deklarationen...

    danke vielmals.



  • Zum Beispiel Klassen-, Typ- oder Namensraumdefinitionen sind sehr oft in Headerdateien anzutreffen:

    namespace xyz // Namensraum-Definition
    {
    
    class MyClass; // Klassendeklaration
    
    class MyClass  // Klassendefinition 
    {
        typedef int Type; // Typdefinition
    };
    
    }
    

  • Mod

    Nexus schrieb:

    typedef int Type; // Typdefinition
    

    ist auch nur eine Deklaration (3.1/2). Das kann man sich klar machen, wenn man überlegt, dass das Ergebnis von typedef auch ein unvollständiger Typ sein kann. z.B.

    typedef void foo;
    class my_class;
    typedef my_class classes[10];
    


  • Danke für die Berichtigung. Das Schlüsselwort type def und die häufige Verwendung des Begriffs Typdefinition haben mich etwas irregeführt.


Anmelden zum Antworten