Header Dateien, wo kommen die Includes rein
-
Hallo,
ich hätte da mal ne generelle Frage zu includes.
Schreibe ich includes die vom Header und von der CPP Datei gebraucht werden in den Header rein, oder sehe ich zu dass ich die Includes so lokal wie möglich halte?
Das würde bedeuten brauche ich ein File in der CPP aber im Header nicht, so würde ich den Include in der CPP machen.
Was ist da die best practice???
-
Procrash schrieb:
Das würde bedeuten brauche ich ein File in der CPP aber im Header nicht, so würde ich den Include in der CPP machen.
ja genau. Ansonsten explodiert die Kompilierzeit (ja, auch bei heutigen Rechnern).
-
Du inkludierst in den .h Dateien nur das, was du wirklich im Header brauchst. Wenn du in den .h Dateien nicht ein Mal das konkrete Objekt brauchst weil z.B. nur Referenzen oder Zeiger benutzt werden und keine Funktionsaufrufe stattfinden, kommst du in der .h Datei sogar nur mit forward declarations aus und musst die passende .h Datei erst in der .cpp Datei inkludieren:
.h Datei
#include "ObjTypeC.h" #include "ObjTypeD.h" class ObjTypeA; class ObjTypeB; class Test { // Bei Zeigern oder Referenzen muss der Compiler das genaue Objektlayout // nicht kennen, daher reicht hier eine forward declaration ObjTypeA* ObjA_; ObjTypeC& ObjC_; // Bei Komposition muss der Compiler das genaue Objektlayout // kennen, also muss ObjTypeC. inkludiert werden. ObjTypeC ObjC_; public: ... void do_something( ObjTypeD* Obj ) { // Für einen Methodenaufruf muss der Compiler das Objekt genau // kennen, also muss ObjTypeD.h inkludiert werden. Obj->do_something_else(); } };
.cpp Datei:
#include "Test.h" #include "ObjTypeA.h" #include "ObjTypeB.h" ...
Jede .h Datei sollte für sich allein übersetzbar sein und sich nicht darauf verlassen, dass andere .h Dateien weitere benötigte .h Dateien inkludieren:
.h TestA
#include <string> ...
.h TestB
// TestA inkludiert <string>, damit ist std::string hier bekannt. Trotzdem sollte man hier // <string> explizit inkludieren und sich nicht darauf verlassen, dass TestA.h das tut. #include "TestA.h" void do_something( const std::string& Line );
-
DocShoe schrieb:
Jede .h Datei sollte für sich allein übersetzbar sein und sich nicht darauf verlassen, dass andere .h Dateien weitere benötigte .h Dateien inkludieren:
Und das kann man sicherstellen indem man die Regel anwendet dass die Reihenfolge der includes "vom spezifischsten zum allgemeinsten" geht. ("from the most specific to the most general" - Bruce Eckel - Thinking in C++). Also alss erstes der Header der cpp-Datei, dann zuerst lokale Header vom selben Projekt, dann erst die von Bibliotheken, und zuletzt die Standardheader.