Frage zur Modularisierung (Header, Sourcefiles)
-
Guten Morgen!
Also, ich möchte meinen Code etwas aufteilen und habe Funktionen und Klassen in andere .cpp Dateien ausgelagert.
Jetzt benutzen all diese Funktionen und Klassen aber die windows.h Bibliothek.Muss ich jede Datei die windows.h mit include einbinden oder reicht es, #include <windows.h> in der main.cpp Datei zu haben?
Also, wenn ich das richtig verstanden habe, wird jede Quelltext Datei einzeln zu einer .o Datei compiliert und am Ende wird das ganze mit dem Linker verbunden. Das suggeriert ja, dass ich auch in jedem Sourcefile jede Bibliothek von der ich gebrauch mache einbinden muss, oder?
Wenn das also so ist, hat das Ganze irgendwelche negative Konsequenzen bezüglich der Größe der ausführbaren Datei? Oder kann ich mir das eher so vorstellen, dass diese #include Befehle mehr so ein Wegweiser sind, damit der Compiler weiss, wo er sich den Code für die ganzen Funktionen hernehmen muss?
Doofe Verständnisbeispiel: Wenn ich wahllos 100erte Bibliotheken einbinde, aber keine Funktion aus diesen Nutze, hat das Einbinden dann irgendwelche anderen Konsequenzen, als dass der Code bescheuert aussieht?
Mit freundlichen Grüßen.
-
Thez schrieb:
Muss ich jede Datei die windows.h mit include einbinden oder reicht es, #include <windows.h> in der main.cpp Datei zu haben?
Du könntest es mal ausprobieren.
Thez schrieb:
Also, wenn ich das richtig verstanden habe, wird jede Quelltext Datei einzeln zu einer .o Datei compiliert und am Ende wird das ganze mit dem Linker verbunden. Das suggeriert ja, dass ich auch in jedem Sourcefile jede Bibliothek von der ich gebrauch mache einbinden muss, oder?
#include bindet nicht die Bibliothek ein. Genauso. wie du es in deinem Code wohl auch gemacht hast, enthalten die Header die Deklarationen der Funktionen, Klassen usw., die du benutzen willst[*]. Zusätzlich muss dem Linker noch die passende Bibliothek mitgegeben werden, damit auch die entsprechenden Implementierungen zur Verfügung stehen. Gelegentlich steht dazu bei Windows eine Anweisung im Hearder, im Regelfall muss man aber dem Linker die Bibliothek und deren Pfad noch extra nennen.
[*] Templates und Inlinefunktionen werden im Header definiert, hier kommt also auch der eigentlich Code mit. Es gibt Header Only Bibliotheken (z.B. boost shared_ptr), bei denen nichts mehr dazu gebunden werden muss