ein Kapitel zurück                                           ein Kapitel weiter

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

Präprozessor


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...

Compiler

Im Compiler wird unser Programm in eine Assemblerdatei Übersetzt.

Assemblerdatei programmname.s oder programmname.asm

...und weiter zum....

Assembler

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
Präprozessor
Quelldatei mit expandierten Präprozessorkommandos programmname.i
Compiler
Assemblerdatei programmname.s oder programmname.asm
Assembler
Objektdatei programmname.o
Ausführbare Datei


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 zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf