003
08.11.2004, 11:36 Uhr
virtual
Sexiest Bit alive (Operator)
|
Hallo,
Du must in C/C++ zwischen Deklaration und Definition unterscheiden:
C++: |
double sqrt(double);
|
Ist eine Deklaration,
C++: |
double sqrt(double) { Code hier }
|
Ist dagegen eine Definition. In headern stehen nur Deklarationen. (Sofort einleuchtend dürfte sein, daß jede Definition auch eine Deklaration ist; eine Deklaration jedoch nicht zwingend eine Definition ist). Der Sinn von Deklarationen ist, dem Compiler mitzuteilen, welche Parameter typen eine Funktion erwartet und welchen Rückagebtypen sie hat.
Sicherlich könnte man, jedenfalls theoretisch betrachtet, auf die Trennung von Deklarationen und Definitionen verzichten, aber wenn man das machen würde, dann müsste man stets die Definitionen zur Hand haben (also in letzter Konsequenz den Sourcecode) und diesen auch immer compilieren. Abgesehen von dem Erhöhten Zeitaufwand, den das Compilieren nach sich ziehen würde, gibt es nach wie vor noch einige populäre Betriebssysteme, die nicht Opensource sind, also wo der Sourcecode nicht verfügbar ist.
Also geht man hin, teil dem compiler (mit Hilfe der Header) mit, wie denn die Funktionen so aussehen, die man aufrufen will. Der Compiler compilert ganz kräftig und erstellt (manchmal intern, manchmal für den User sichtbar) eine Zwischendatei, die Objektdatei. Eine solche Objektedatei ist verienfacht gesprochen, Dein Source in einem Compilierten format, wobei allerdings da noch Platzhalter drin sind: zB wusste der Compiler ja nicht, wie sqrt innen drin aussieht und ist daher hingegangen und hat an die fragliche Stelle in der Objektdatei einen Vermerk eingebaut "sqrt bitte hier einfügen".
nachdem der Compiler kompiliert hatte, geht der ganz Kram an den Linker. Der Linker kümmert sich genau um diese Verweise und bindet die Bibliotheken dazu, in deinem Fall eben eine, die sqrt enthält.
Zwar mag es für die auf den Ersten Blick so aussehen, als würde alles in einem Durchlaufgemacht werden: es ist aber tatsächlich so, daß du einen Compiler und einen Linkerdurchlauf hast (eigentlich sinds noch mehr, aber die tun hier nichts zur sache). Der Compiler braucht an keiner Stelle zu wissen, wie sqrt innen drin aussieht. Der Linker braucht das eigentlich auch nicht zu wissen (sqrt könnte ja auch in einer anderen Sprache geschrieben sein). Der Linker weiss einfach nur: es gibt eine Library, da gibt es ein srt drin. Das bindet er eben dazu. Hier gibt es unterschiedliche Modelle, eine ausführliche diskussion führt an dieser stelle zu weit.
Bleibt noch die Frage, woher weiss der Linker, in welcher Library welche Funktion steht? - Im zweifel weiss er es nicht und man muß es ihm sagen. Bei so Standardfunktionen verfügt der Linker über eine Liste von Standardlibraries, die er automatisch linkt. Der Name dieser Libraries ist nicht standardiesiert und unerheblich, solange es keine Probleme gibt. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 08.11.2004 um 11:36 Uhr von virtual editiert. |