Standard C Coding - Compile & Link
-
Hallo Jungs,
ich habe mal eine kleine Grundsatzfrage wie das Kompilieren und Linken von Standard C Libraries/Code funktioniert.Ich möchte mal als simples Beispiel die Funktion printf() nehmen. Also Compiler nehme ich den mingw (gcc) heran.
So der Prototyp für die printf() Funktion ist in der Headerdatei stdio.h definiert.
http://www.dinkumware.com/manuals/?manual=compleat&page=stdio.html#printfSo um mir nun z.B. den Code anzusehen, wie die Funktion printf() geschrieben ist suche ich nach einer "stdio.c" Datei - diese wird aber nicht mit ausgeliefert.
D.h. die Funktion printf() muss in irgendeiner Library oder sonstwo versteckt sein.Nach meinen Verständnis wird beim Einbinden einer Header Datei eine Art "Copy&Paste" in die zu includierende C-Datei gemacht. Danach werden alle C-Dateien zu jeweils einer Obj Datei und anschliessend linkt der Linker dann die Objs zu einem Binary.
Dieser Schritt scheint aber bei den ANSI-C inkludierten Funktionen (denn da gibts ja keine C-Datei) irgendwie anders zu funktionieren. Desweiteren muss ja die ganze Sache statisch gelinked werden, da sonst das Binary auf einen anderen Rechner ohne Entwicklungsumgebung gar nicht laufen würde.
Nun meine Fragen:
-
Wie und wo kann ich mir den Code zu der Funktion ansehen, wenn es keine dazu passenden C-Dateien gibt?
-
Wenn ich die Headerdateien in meinen Projekt vergesse einzubinden, die enstsprechenden Funktionen aber in den C-Dateien existieren, dann wird ja eine Art "Default-Prototyp" in dem "aufrufenden C-Coding" für die Funktion erstellt - nach welchen Regeln wird dieser erstellt?
Als Beispiel mal die Funktion malloc(), die in der stdlib.h definiert ist. Würde ich vergessen die stdlib.h in meinen Code mit einzubinden, dann wird ja vom Compiler ein Prototyp "int malloc()" angelegt.
Vielen Dank für euere Hilfe
-
-
weiss jetzt nicht wie das bei der C-stdbibliothek is aber wenn du verhindern willst, dass dein code für andere nicht sichtbar ist, dann verwendest du dafür auch die obj dateien der .c Files, also die schon übersetzten. Die stehen dann auch dem Linker bereit (sowas hat die stdbibliothek sicher auch). wenn sie in einem, für den linker bekannten ordner liegen, dann findet der die funktion schon, auch malloc(), darum brauchst du dir keine gedanken zu machen. prototypen erstellen tut aber niemand ausser dir!
-
codefrag schrieb:
Nach meinen Verständnis wird beim Einbinden einer Header Datei eine Art "Copy&Paste" in die zu includierende C-Datei gemacht. Danach werden alle C-Dateien zu jeweils einer Obj Datei und anschliessend linkt der Linker dann die Objs zu einem Binary.
ja, mehr oder wenig
codefrag schrieb:
Dieser Schritt scheint aber bei den ANSI-C inkludierten Funktionen (denn da gibts ja keine C-Datei) irgendwie anders zu funktionieren. Desweiteren muss ja die ganze Sache statisch gelinked werden, da sonst das Binary auf einen anderen Rechner ohne Entwicklungsumgebung gar nicht laufen würde.
das ligt aber daran, dass der Link Vorgang die Standard Libc dynamisch (bzw. statich, je nach Linker Audruf) einbindet, deswegen benötigst du den Source Code von printf nicht, denn der steckt ja in einer Bibliothek (unter Unix in der /usr/lib/libc.so, unter Windows keine Ahnung, bestimmt irgendwo in einer dll)
Unter Unix (speziell Linux) gibt es die GLibC. Das ist die Implementierung der Standard C Library, darunter printf, scanf, malloc, realloc, usw. Da diese Bibliothek in jedem System vorhanden ist (außer man nimmt uclibc bei Embededd Systems oder so) braucht man nicht statisch zu linken.
Zu 1)
Im Source Code der Bibliothek, sofern ihrer Code frei verfügbar ist, ansonsten hast du keine Chance den Code anzusehen.Zu 2)
Die Prototypen sind erstmal dazu da, dass der Compiler weiß, womit er zu tun hat. Wenn du sowas machst wie/* irgendwas.h */ #ifndef ... #define ... struct something foo(void *bar); #endif
#include <irgendwas.h> void foobar(void) { struct something x = foo(NULL); }
dann weiß der Compiler, dass es eine Funktion gibt, die foo heißt, vom Typ "struct something" und einen Parameter bar hat, welches ein typenloser Pointer ist. Dem Compiler ist das egal, was 'foo' macht und wo sie definiert ist.
Sagen wir mal, du vergisst dein "#include <irgendwas.h>". Dann weiß der Compiler nicht, dass es eine Funktion foo gibt, die bla bla bla. Er sieht nur, dass du versuchst eine für ihn unbekannte Funktion foo aufzurufen, er nimmt an, diese liefert einen int zurück aber du weist die Rückgabe ohne cast in eine "struct something" Variable. Deswegen auch die Warnung, da unter Umständen falsch gecastet wird. Die Prototypen sind erstmal da, damit der Compiler weiß womit er zu tun hat. Wo die Funktionien tatsächlich definiert sind, ist eine Linker Geschichte.
-
supertux schrieb:
Unter Unix (speziell Linux) gibt es die GLibC. Das ist die Implementierung der Standard C Library, darunter printf, scanf, malloc, realloc, usw. Da diese Bibliothek in jedem System vorhanden ist (außer man nimmt uclibc bei Embededd Systems oder so) braucht man nicht statisch zu linken.
Zu 1)
Im Source Code der Bibliothek, sofern ihrer Code frei verfügbar ist, ansonsten hast du keine Chance den Code anzusehen.Dachte ich mir schon das der Code in einer Library steckt und nicht einsehbar ist - schade
supertux schrieb:
Zu 2)
Die Prototypen sind erstmal dazu da, dass der Compiler weiß, womit er zu tun hat.
Sagen wir mal, du vergisst dein "#include <irgendwas.h>". Dann weiß der Compiler nicht, dass es eine Funktion foo gibt, die bla bla bla. Er sieht nur, dass du versuchst eine für ihn unbekannte Funktion foo aufzurufen, er nimmt an, diese liefert einen int zurück aber du weist die Rückgabe ohne cast in eine "struct something" Variable. Deswegen auch die Warnung, da unter Umständen falsch gecastet wird. Die Prototypen sind erstmal da, damit der Compiler weiß womit er zu tun hat. Wo die Funktionien tatsächlich definiert sind, ist eine Linker Geschichte.Sorry hatte mich vielleicht etwas ungeschickt ausgedrückt. Für was Prototypen da sind etc. ist mir schon klar und das der Compiler sich einen "Default" Prototypen zusammenbastelt ist auch klar - meine Frage war lediglich macht er aus den Funktionen immer ein "int function_name()" oder macht er es evtl noch anders?
Greetz
-
codefrag schrieb:
Dachte ich mir schon das der Code in einer Library steckt und nicht einsehbar ist - schade
meistens wird der source code für diese libs aber mitgeliefert.
selbst bei compilern von closed source fanatikern wie microsoft ist er dabei...
-
codefrag schrieb:
meine Frage war lediglich macht er aus den Funktionen immer ein "int function_name()" ?
ja.