Verschachtelte Includes
-
Hi,
Hab da ein Problem, vielleicht hab ich das mit den Includes nicht ganz verstanden oder es läuft irgendwas falsch.
Also folgendes Problem:
main.cpp
#include <string> #include "test.h"test.h
#include "test1.h"In test1.h wird string verwendet, und es funktioniert.
Wenn man aber <string> in test.h (vor test1.h) includiert kennt er string in test1.h nicht mehr.Also etwa so:
main.cpp: #include "test.h" test.h: #include <string> #include "test1.h" <- verwendung von string / string aber nicht bekanntWarum?
Das dürfte doch keine Rolle spielen, denn es wird ja in beiden Fällen vor der verwendung includiert.
PS: string ist nur ein Beispiel, funktioniert auch mit anderen Header nicht
-
Du kannst nur die Namen verwenden, die vorher definiert wurden - und wenn sich die "test1.h" darauf verlässt, daß string definiert ist, musst du sie nach der <string> einbinden, sonst findet dein Compiler die Namen nicht wieder.
(aber besser ist es sowieso, wenn sich jeder Header selbst um die includes kümmert, die er benötigt - wenn "test1.h" die string-Klasse verwendet, bindest du dort den <string>-Header ein)
-
Na das ging ja schnell...
CStoll schrieb:
wenn sich die "test1.h" darauf verlässt, daß string definiert ist, musst du sie nach der <string> einbinden
Hab ich doch gemacht?
#include <string>
#include "test1.h"CStoll schrieb:
(aber besser ist es sowieso, wenn sich jeder Header selbst um die includes kümmert, die er benötigt - wenn "test1.h" die string-Klasse verwendet, bindest du dort den <string>-Header ein)
Dazu hätte ich auch noch eine Frage.
Mit #ifndef _HEADER_H_ und #define _HEADER_H_ wird verhindert, das der selbe Header zweimal eingebunden wird.
Wenn man jetzt aber noch eine "test2.h" hat, welche ebenfalls string verwendet, ist es denn sinnvoll dort und generell in alle Header die <string> brauchen diesen extra zu includieren?
Ausserdem dürfte das doch auch gar nicht gehen da das #ifndef eine 2te includierung verhindert, oder?
Somit stellt sich mir die Frage warum man dieses #ifndef braucht?
Man wird wohl kaum schreiben:
#include <string>
#include <string>Und wenn da kein #ifndef steht und man wild rumincludiert, wird doch die .exe riesig, oder nicht?
-
Cloud schrieb:
Na das ging ja schnell...
CStoll schrieb:
wenn sich die "test1.h" darauf verlässt, daß string definiert ist, musst du sie nach der <string> einbinden
Hab ich doch gemacht?
#include <string>
#include "test1.h"Dann könnte ich mir noch vorstellen, daß du Probleme mit falschen namespaces hast.
Dazu hätte ich auch noch eine Frage.
Mit #ifndef _HEADER_H_ und #define _HEADER_H_ wird verhindert, das der selbe Header zweimal eingebunden wird.
Wenn man jetzt aber noch eine "test2.h" hat, welche ebenfalls string verwendet, ist es denn sinnvoll dort und generell in alle Header die <string> brauchen diesen extra zu includieren?
Ja, ist schon sinnvoll - und die Standard-Header dürften/sollten auch per include-Guard gesichert sein.
Ausserdem dürfte das doch auch gar nicht gehen da das #ifndef eine 2te includierung verhindert, oder?
Klar geht das - wenn in der aktuellen Übersetzungseinheit der Header noch nicht kam, wird er eingebunden. Wenn er schon kam, kann der Compiler auf die Definitionen vom ersten Mal zugreifen.
Somit stellt sich mir die Frage warum man dieses #ifndef braucht?
Man wird wohl kaum schreiben:
#include <string>
#include <string>Direkt wird man das vermutlich nicht schreiben, aber indirekt kann es schon passieren, wenn zwei deiner Header die <string> einbinden.
Und wenn da kein #ifndef steht und man wild rumincludiert, wird doch die .exe riesig, oder nicht?
Nein, dann zerhaut's vor allem den Compiler, weil irgendwelche Definitionen zu oft im Quelltext auftauchen.