Noch mehr Fragen zu headern



  • Hey Leute,

    Das vorherige Posting von SirLant und Krösus hat mir schon sehr geholfen, aber mir ist der Stellenwert der header leider noch nicht ganz klar. ich kann mir noch nicht erklären, wie die header's an die implementierten Funktionen kommen. Wenn ich mir die mal anschaue, einfaches Beispiel stdio.h so sehe ich ja nur die Deklaration der Funktionen, Konstanten und Makros. Was die Arbeit des Präprozessors bezogen auf die Konstanten und Makros angeht, ist mir auch klar. So weit so gut, aber wie kommt dann der header an die tatsächliche Funktion und wo liegt die z.B. bei Windows. Diese Informationen gehen aus dem header halt einfach nicht hervor, und in den meisten Büchern werden die halt einfach genutzt als wüchsen sie auf irgenweinem Baum.
    Mein größtes Verständnisproblem ist bei C sicher noch das binden. Was wird statisch gelinkt, und was (wenn überhaupt) dynamisch. Leider gehen halt die meisten Bücher, die man so kriegt nicht so detailliert darauf ein. Vielleicht könnt ihr mir da noch einen Buchtipp geben.

    Dank euch im Voraus

    Sponsi



  • Der Compiler braucht ja nur die Deklarationen der Funktionen, die eben in die Header kommt (lassen wir mal inline Funktionen etc. weg). Daraus erstellt der Compiler eben die Objekt Dateien. Beim Linken löst nun der Linker die Funktionsnamen, die der Compiler in die Objekt Datei gepackt hat auf und ersetzt diese durch Aufrufe für die entspr. Funktionen.

    statisch Linken bedeutet, dass die Librarys direkt in die Ausführbare Datei gepackt werden. Dynamisch Linken bedeutet, dass die Librarys in einer dynamisch ladbaren Form vorliegen und erst zu Laufzeit geladen werden.



  • Hey Kingruedi,

    erstmal danke für Dein Posting!!!
    Das heißt also, dass der Linker die Funktionsimplementierungen aus den Bibliotheken heraussucht, und das anhand der Funktionsdeklarationen, die in den headern angegeben werden. Er erkennt sie also einfach anhand der Form des Funktionskopfes wie Rückgabewert Funktionsname(Parameterliste), hab ich das richtig verstanden (wenigstens ungefähr)? Das heiße dann also, dass die header nicht viel mehr sind als so eine Art ausgelagerter Programmkopf.

    Sponi



  • Deswegen heißt es ja auch Deklaration, d.h. der Header "erklärt" dem Compiler wie die
    Funktion u. ä. aussieht. Dadurch kann der Compiler kontrollieren ob der Aufruf korrekt erfolgt, und dann
    den Aufruf korrekt übersetzen.

    Erst im zweiten Schritt der Programmerzeugung werden durch den Linker die entsprechenden Libraries, die
    den Code der entsprechenden Funktionen enthalten dazugebunden. Je nach Qualität des Linkers werden nur
    die Funktionen dazugebunden die benötigt werden, oder bei älteren / einfacheren Linkeren das gesamte LIB file.

    Die meisten dieser einzubindenen Libs braucht der Benutzer nicht explizit anzugeben dies geschieht durch
    die Development-Umgebung / das Make-file.

    Die Funktionen von denen su sagst sie halt "einfach genutzt als wüchsen sie auf irgenweinem Baum",
    gehören zur C-Runtime Library (CRTL), diese sind normiert werden durch den C-Compiler Hersteller mitgeliefert.

    Einen weiteren Anteil haben Erweiterungsfunktionen des Compilerherstellers wie z. B. _strncmpi, itoa und andere.

    Einen dritten Anteil haben, gehört zur API (Applikation Programmers Intrface) des Betriebssystems als Beispiel die WinAPI (dafür gibst hier sogar eine eigenes Forum)

    Einen vierten Anteil haben extern beschaffte (gekauft/Freeware) Libraries (z.B Libraries für Mathematik/Graphik). Diese bringen ihre eigenen Header files und libraries mit

    Nicht zu vergessen sind die selbsterstellten Libraries, mit denen man z.B. oft genutzte Funktionen für mehrere Projekte bereitstellt.



  • Hey PAD,

    dank Dir!!! Ich glaube, damit habe ich schon mal einen guten Überblick, wie das in C so läuft, zumal ich im Petzold noch ein bisschen was über die .dll's gelesen habe. Den Rest kann ich dann von Java und php zum großen Teil übernehmen.

    Super Forum 👍

    Gruß

    Sponsi


Anmelden zum Antworten