Verständnisproblem bezüglich Headerdateien
-
Hallo miteinander
habe mich mal daran versucht, die Programmiersprache C etwas besser verstehen zu lernen. Nach einigen Versuchen und ewiger Leserei ist mir eines völlig unklar:
Wie wird der Quellcode von Funktionen implementiert, die man über die #include-Anweisung einbindet? Beispiel:
Ich schreibe z.B. zu Beginn eines Programms #include <stdio.h>, weil ich beispielsweise die Funktion printf benötige. In der stdio.h stehen aber doch nur Prototypen der diversen Funktionen. Woher gibt mein Programm dem System zu verstehen, wie ein Aufruf der Art
printf("Das Resultat lautet: %f", ergebnis);
zu behandeln ist?
-
Funktionen wie printf liegen in compilierter Form in der Standardlibrary vor, die vom Linker mit den Objektfiles, die der Compiler aus deinen Quelldateien macht, zu einem ausführbaren Programm zusammengebunden wird.
-
In Headerfiles stehen typischerweise nur die Deklarationen von
Funktionen.Der Compiler bindet diese Datei vollständig in das c-File ein.
Wird nun eine Funktion benutzt, überprüft der Compiler, ob diese
Funktion ihm schon bekannt ist, entweder dadurch, dass die
Funktion schon vorher definiert ist, oder es vorher eine
Deklaration gab. Wenn er einen Eintrag findet, ist alles in
Ordnung.Dann werden alle Funktionen übersetzt.
Am Ende beim Linken erzeugt der Compiler aus den Übersetzungen
der einzelnen Funktionen einen ausführbares Programm. Dabei können
Übersetzungseinheiten in sogenannten Bibliotheken dem Compiler
zugänglich gemacht werden.Nun entsteht daraus ein fertiges Programm.
Zu den Includes wie stdio.h, stdlib.h findet der Compiler die
Übersetzungen in sogenannten Standardbibliotheken, die beim
Compilieren nicht extra angegeben werden müssen.So, ich hoffe, dass ich mich nicht allzu sehr geirrt habe.
Gruß mcr
PS: hier findest du mehr Informationen: http://de.wikipedia.org/wiki/Compiler#Aufbau_eines_Compilers
-
So ist das schon viel verständlicher - vielen lieben Dank dafür.
Aber wie ist das denn, wenn ich selbst getrennt kompilieren möchte? Wenn ich mein Programm in eine .h- und eine .c-Datei aufteile, dann liegt meine Quellcodedatei nicht in kompilierter Form in der Standardbibliothek vor.
Bliebe mir dann keine andere Wahl, als die Quellcodedatei in den Header einzubinden?
-
üblicher weise schreibt man die prototypen in den header, die man irgendwo anders im programm einbinden möchte.
also z.b. hast du die dateien a.c und b.c
jetzt brauchst du in b.c zugriff auf eine funktion, die in a.c ist.
also schreibst du dir nen header a.h und deklarierst dort den prototypen.
den machst du dann mit #include a.h in der datei b.c bekannt.oder du schreibst in der datei b.c eine extern-deklaration dieser funktion.
-
absBeginer schrieb:
So ist das schon viel verständlicher - vielen lieben Dank dafür.
Aber wie ist das denn, wenn ich selbst getrennt kompilieren möchte? Wenn ich mein Programm in eine .h- und eine .c-Datei aufteile, dann liegt meine Quellcodedatei nicht in kompilierter Form in der Standardbibliothek vor.
Bliebe mir dann keine andere Wahl, als die Quellcodedatei in den Header einzubinden?Du kannst dem Compiler zusätzliche Bibliotheken mitgeben, die einzeln
kompiliert werden können.
Nur wenn du ein ausführbares Programm kompilierst, brauchst du alle
Bibliotheken.Gruß mcr