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


Anmelden zum Antworten