Hallo, ich habe zwei .c files die die selben Header Dateien benötigen. Wenn ich nun in jedes file eine include-Anweisung schreibe, kapiert dann der Linker dass ich für das eigentliche Programm den Inhalt der Headerdateien nur einmal benötige, oder wird der Inhalt am Ende wirklich zweimal ins fertige Programm geschrieben und damit unnötig Speicherplatz verschwendet?
Der Linker hat mit Headerdateien überhaupt gar nichts am Hut. Der Inhalt von Headerdateien wird auch gar nichts "ins Programm geschrieben". Wenn Du allerdings den Fehler begehst, in Headerdateien Dinge nicht nur zu deklarieren, sondern auch zu definieren, dann wird der Linker sich über doppelt definierte Symbole beschweren. Dir ist nicht klar, was ich mit der Unterscheidung zwischen Deklaration und Definition meine? Nehmen wir mal eine globale Variable:
1 | int meineGlobaleVariable; |
ist die Definition der Variablen. So etwas darf im gesamten Programm genau einmal auftauchen, und hat daher in einer Headerdatei nichts verloren. So etwas gehört in eine Source-Datei (*.c).
1 | extern int meineGlobaleVariable; |
Das ist eine Deklaration einer anderswo definierten Variablen. Das kann in einer von zig Source-Dateien eingebundenen Headerdatei stehen, ohne daß es zu Problemen führt. Damit das Programm erfolgreich gelinkt werden kann, muss allerdings genau eine Definition im Programm vorhanden sein.
Danke, das ist mir klar. Es geht mir auch nicht darum ob es Probleme gibt, wenn Headerdateien mehrfach eingebunden werden. Meine Frage ist, ob beim Übersetzen dann nicht unnötig Speicherplatz verschwendet wird, weil der Code der Headerdatei dann mehrfach im fertigen Programm vorhanden ist.
Welcher Code? In einer Headerdatei ist kein Code. Darin sind nur #defines, Typdeklarationen, Variablendeklarationen (s.o.) und Funktionsprototypen zu finden - und die werden zu exakt 0 Bytes Code übersetzt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.