![ein Kapitel weiter](../weiter.gif)
Wenn in der Sprache C ein Programm Übersetzt (compiliert und gelinkt) werden soll wird, bevor der Compiler den Quelltext bekommt, von einem besonderen Teil des Compilers dem Präprozessor ein zusätzlicher Übersetzungslauf durchgeführt. Jetzt mal zur Erklärung wie ein Programm das wir geschrieben haben überhaupt Übersetzt wird ...
Quelldatei,Quellcode |
programmname.c |
Hier ist erst mal unsere Quelltextdatei die wir geschrieben haben mit der Endung *.c
So unser Präprozessor kann jetzt theoretisch drei Aufgaben erfüllen:
1. Einkopieren von externen Dateien in die zu übersetzende Datei. Zum Beispiel '#include <stdio.h/usr/include/ oder bei Windows mit DJGPP z.B. in c:\djgpp\include oder c:\bc45\include (Borland 4.5). Sie müssen einfach im Verzeichnis ihres Compilers schauen. Natürlich ist es auch möglich eigene Header - Dateien zu schreiben und einlesen zu lassen. Nehmen wir mal an sie haben eine Headerdatei geschrieben und diese im Verzeichnis /home/myownheaders unter den Namen 'meinheader.h' gespeichert. So müssen sie ihre Header - Datei
lediglich am Anfang Ihres Programms mit....
#include "/home/myownheaders/meinheader.h"
..einbinden. Eben das Verzeichnis angeben indem sie ihre Header - Datei gespeichert haben. Später werden sie lernen wie wir eigene Bibliotheken entwickeln und diese in den Compiler einbinden wie es bei <stdio.h> der Fall ist.
2. Textuelles Ersetzen von symbolischen Konstanten und Makros mit '#define'. Dazu im nächsten Kapitel mehr.
3. Bedingte Kompilierung mit '#ifdef'. Auch dazu ein weiteres Kapitel.
Der Präprozessor erkennt die für ihn bestimmte Anweisungen durch das Zeichen '#'. Diesem Zeichen darf kein Whitspace-Zeichen (Leerzeichen, \f, \n, \r, \t, \v) folgen wie in folgendem Beispiel...
# include //falsch Leerzeichen zwischen '#' und include
...ist nicht erlaubt da zwischen dem Zeichen '#' und include ein Leeraum ist.
Nächster Schritt....
Quelldatei mit expandierten Präprozessorkommandos |
programmname.i |
Nachdem unsere Präprozessorkommandos jetzt übersetzt sind kann unser Programm kompiliert werden...
Im Compiler wird unser Programm in eine Assemblerdatei Übersetzt.
Assemblerdatei |
programmname.s oder programmname.asm |
...und weiter zum....
Der Assembler übersetzt unser Programm dann entgültig in eine Maschinensprache, die für uns Menschen eigentlich nicht mehr lesbar bzw verständlich ist. Sie können sich ja mal eine solche Maschinensprache genannt Objektdatei mit der Endung *.o mit einem Hexeditor ansehen....
Objektdatei |
programmname.o |
Jetzt nochmals alle Schritte bis ein Ausführbare Datei daraus wird....
Quelldatei,Quellcode |
programmname.c |
Quelldatei mit expandierten Präprozessorkommandos |
programmname.i |
Assemblerdatei |
programmname.s oder programmname.asm |
Objektdatei |
programmname.o |
Steht die Headerdatei zwischen eckigen Klammern (#include <datei.h>) so wird die Headerdatei datei.h im impementierungsdefinierten Pfad (der include-Pfad Ihres Compilers) gesucht. Dieser Pfad ist wie oben genannt in denen sie die Headerdateien befinden (Beispiel Linux: /usr/include).
Steht die Headerdatei zwischen 2 Hochkommata (#include "datei.h") so wird die Headerdatei im aktuellen Working Directory oder in dem Verzeichnis gesucht das mit dem Compileraufruf -I angegeben wurde. Sollte diese Suche erfolglos sein so wird in den selben Pfaden gesucht als wäre #include <datei.h> eingeben worden.
Hier ein kurzer Überblick über ein paar Standart Headerdatei die auf allen System vorhanden sind und auf die wir im Laufe des Kurses auch eingehen werden.
Header - Dateien |
Bedeutung |
ASSERT.H |
Fehlersuche und Debugging |
CTYPE.H |
Zeichentest und Konvertierung |
ERRNO.H |
Fehlercodes |
FCNTL.H |
Low-Level-Datei I/O |
IO.H |
Datei I/O |
MALLOC.H |
Hauptspeicherzugriff |
MATH.H |
Fließkommaarithmetik |
SETJMP.H |
Unbedingte Sprünge |
SIGNAL.H |
Signale und Interrupts |
STDARG.H |
Variable Parameterübergabe |
STDDEF.H |
Standard - Datentyp |
STDIO.H |
I/O |
STDLIB.H |
Standarddeklarationen |
STRING.H |
Zeichenkettenoperationen |
TIME.H |
Datum und Uhrzeit |
Hierzu nochmals ein Ablaufplan wie unser Quelltext zum Ausführbaren Programm wird...
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|