In diesem Kapitel erfahren Sie einiges zum Präprozessor. Der Präprozessor ist ein Teil des Compilers, der noch vor der Übersetzung einige Änderungen am Quelltext vornimmt.
10 Präprozessor-Direktiven
Wenn in der Sprache C ein Programm übersetzt (kompiliert und gelinkt) werden soll, dann wird, bevor der Compiler den Quelltext verarbeitet, von einem besonderen Teil des Compilers – dem Präprozessor – ein zusätzlicher Übersetzungslauf durchgeführt. Bei Präprozessor-Direktiven steht immer das Zeichen # am Anfang der Zeile. Außerdem darf pro Zeile nur eine Direktive eingesetzt werden. Folgendes ist also nicht erlaubt:
#include <stdio.h> #include <stdlib.h>
Kommentare hingegen dürfen sehr wohl hinter einer Direktive stehen:
#include <stdio.h> /* Headerdatei für Standardfunktionen */
Die folgenden Arbeiten fallen für den Präprozessor neben der Quelltextersetzung ebenfalls an:
- Stringliterale werden zusammengefasst (konkateniert).
- Zeilenumbrüche mit einem Backslash am Anfang werden entfernt.
- Kommentare werden entfernt und durch Leerzeichen ersetzt.
- Whitespace-Zeichen zwischen Tokens werden gelöscht.
Des Weiteren gibt es Aufgaben für den Präprozessor, die vom Programmierer gesteuert werden können:
- Header- und Quelldateien in den Quelltext kopieren (#include)
- symbolische Konstanten einbinden (#define)
- bedingte Kompilierung (#ifdef, #elseif, ...)
Auf die Präprozessor-Direktiven, die Sie als Programmierer selbst steuern können, gehe ich auf den folgenden Seiten ein.
10.1 Einkopieren von Dateien mittels »#include« 

Die Direktive #include kopiert andere, benannte (Include-)Dateien in das Programm ein. Meistens handelt es sich dabei um Headerdateien mit der Extension *.h oder *.hpp. Hier sehen Sie die Syntax der Präprozessor-Direktive include:
#include <header > #include "header"
Der Präprozessor entfernt die include-Zeile und ersetzt diese durch den Quelltext der include-Datei. Der Compiler erhält anschließend einen modifizierten Text zur Übersetzung.
Natürlich können Sie damit eigene Headerdateien schreiben und diese einkopieren lassen. Sie haben beispielsweise eine Headerdatei geschrieben und diese im Verzeichnis /HOME/MYOWNHEADERS unter dem Namen meinheader.h gespeichert. Dann müssen Sie diese Headerdatei am Anfang des Quelltextes mit
#include "/home/myownheaders/meinheader.h"
einkopieren. Dabei muss dasjenige Verzeichnis angegeben werden, in dem die Headerdatei gespeichert wurde. Steht die Headerdatei hingegen zwischen eckigen Klammern (wie dies bei Standardbibliotheken meistens der Fall ist), also so:
#include <datei.h>
so wird die Headerdatei datei.h im implementierungsdefinierten Pfad gesucht. Dieser Pfad befindet sich in dem Pfad, in dem sich die Headerdateien Ihres Compilers befinden.
Steht die Headerdatei zwischen zwei Hochkommata, also so:
#include "datei.h"
so wird diese im aktuellen Arbeitsverzeichnis oder in dem Verzeichnis gesucht, das mit dem Compiler-Aufruf -I angegeben wurde – vorausgesetzt, Sie übersetzen das Programm in der Kommandozeile. Sollte diese Suche erfolglos sein, so wird in denselben Pfaden gesucht, als wäre #include <datei.h> angegeben.
Abbildung 10.1 zeigt die einzelnen Schritte, durch die aus dem Quellcode eine ausführbare Datei wird (von oben nach unten).
Abbildung 10.1 Von der Quelldatei zur ausführbaren Datei
Tabelle 10.1 enthält eine Übersicht der Standard-Headerdateien, die von ANSI C vorgeschrieben sind:
Headerdatei | Bedeutung |
assert.h |
Fehlersuche und Debugging |
ctype.h |
Zeichentest und Konvertierung |
errno.h |
Fehlercodes |
float.h |
Limits/Eigenschaften für Gleitpunkttypen |
limits.h |
Implementierungskonstanten |
locale.h |
länderspezifische Eigenschaften |
math.h |
mathematische Funktionen |
setjmp.h |
unbedingte Sprünge |
signal.h |
Signale |
stdarg.h |
variable Parameterübergabe |
stddef.h |
Standard-Datentyp |
stdio.h |
Standard-I/O |
stdlib.h |
nützliche Funktionen |
string.h |
Zeichenkettenoperationen |
time.h |
Datum und Uhrzeit |
Beim C99-Standard (bzw. C95) sind dann noch folgende Headerdateien neu hinzugekommen (sie sind allerdings nicht in allen Compilern vorhanden):
Headerdatei | Bedeutung |
complex.h |
komplexe Arithmetik (Trigonometrie etc.) |
Fenv.h |
Kontrolle der Gleitpunkzahlen-Umgebung |
inttypes.h |
für genauere Integertypen |
iso646.h |
alternative Schreibweisen für logische Operatoren; zur Verwendung von Zeichensätzen im ISO-646-Format (seit C95 vorhanden) |
stdbool.h |
boolesche Datentypen |
stdint.h |
ganzzahlige Typen mit vorgegebener Breite |
tgmath.h |
typengenerische Mathematik-Funktionen |
wchar.h |
Umwandlung von Strings in Zahlwerte für den erweiterten Zeichensatz; String- und Speicherbearbeitung für den erweiterten Zeichensatz; Ein- und Ausgabe für den erweiterten Zeichensatz (seit C95 vorhanden) |
wctype.h |
Zeichenuntersuchung für den erweiterten Zeichensatz (seit C95 vorhanden) |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.