Atari Logo
Atari Computer

Hauptseite -
Welches System? -
Hardware -
Software -
Emulatoren -
Internet
MausNet
Programmieren
Verweise
Über

C

Home Inhaltsverzeichnis Cookie Jar defines für den Cookie Jar

11 Preprozessor

Was bis jetzt noch nicht erklärt wurde, sind die Zeilen mit dem Lattenkreuz bzw. Hash '#' als ersten Buchstaben. Es handelt sich hierbei um Anweisungen für den Preprozessor. Der Preprozessor ist in der Regel ein eigenständiges Programm, das vor dem eigentlichen Compiler den Quelltext bearbeitet. Eine Anweisung für den Preprozessor kann an jeder beliebigen Stelle im Quelltext stehen, muß aber eine eigene Zeile belegen. Natürlich muß das Ergebnis nach dem Preprozessorauf wieder ein korrektes C Programm ergeben. Im folgenden werden die Möglichkeiten des Preprozesors der Reihe nach besprochen.

#include <stdio.h>

Die Include Anweisung fügt den Inhalt der angegebenen Datei in den Quellcode ein. Wird der Name in spitzen Klammern (kleiner, größer) angegeben, wird nur das Verzeichnis nach dieser Datei durchsucht, das bei der Installation des Comilers als Include Verzeichnis angegeben wurde. Dies wird für die mit dem Compiler mitgelieferten Include Dateien benötigt. Wird der Name in doppelten Hochkommas angegeben, wird zuerst das aktuelle Verzeichnis und danach das Systemverzeichnis durchsucht. Dies wird ausgenutzt, um ein Programm modular zu compilieren und dazu entsprechende Include Dateien anzulegen. Dazu finden sich Beispiele im Kapitel über modulares Compilieren.

#define PI 3.141592

Mit der Define Anweisung wird eine Regel für Textersetzungen definiert. überall, wo im Quellcode der erste Text auftaucht, wird er durch den zweiten ersetzt. Als Konvention werden Konstanten, die durch define definiert werden, üblichereise in Großbuchstaben geschrieben. Dies ist aber kein muß. Die Möglichkeiten dieser Textersetzung gehen so weit, daß der Präprozessor auch in der Lage ist, Parameter zu erkennen und damit auch Makros definiert werden können. Als Beispiel läßt sich das Minimum zweier Zahlen auch als Makro über den Prèprozessor lösen und ist damit unabhängig von dem tatsächlich verwendeten Datentyp:

#define max(x,y) ((x)>(y)?(x):(y))

Der Preprozesor erkennt x und y als Parameter. In dem Ersatztext sollten diese Parameter geklammert werden, da es sich um Ausdrücke handeln kann und unter Umständen durch die Rangfolge der Operatoren ein ganz anderer Ausdruck als der beabsichtige entstehen kann. Zu Verdeutlichung zeigen die folgenden Beispiel einmal den Qelltext vor und anschließend nach dem Preprozessorlauf.

#define max(x,y) ((x)>(y)?(x):(y))

int main(void)
   int x,y;

   y = 2;
   x = max(3,y+3);

Nach dem Peprozessor sieht das wie folgt aus:

#define max(x,y) ((x)>(y)?(x):(y))

int main(void)
   int x,y;

   y = 2;
   x = ((3)>(y+3)?(3):(y+3));

#ifdef

Mit ifdef kann abgefragt werden, ob ein bestimmter Name per define definiert worden ist. Wenn ja, wird der dahinter stehende Code bis zum else oder endif, wenn kein else vorhanden ist, für den Compiler im Quelltext belassen. Der nicht zutreffende Teil ist für den Compiler nicht sichtbar. Er wird nicht in den Code übernommen, den der Compiler letztendlich auswertet. Es gibt auch die Abfrage, ob ein Name per define nicht definiert ist. Hiermit können bestimmte Teile des Codes "eingeschaltet" werden, solange noch an dem Programm entwickelt wird und zusätzliche Ausgaben erwünscht sind. Dadurch, das der Name nicht definiert wird, erzeugt man die Version, die ausgeliefert wird. Bei vielen Compilern ist es außerdem möglich, für solche Zwecke einen Namen beim Aufruf des Compilers zu definieren. Und damit die Verwendung anschaulicher wird, folgt hier ein Beispiel.

int main(void)

   int x;

   x = 3;
#ifdef TEST
   x += 4;
#endif
   printf("x = %d", x);

und nun das gleiche Beispiel mit der Definition von TEST.

#define TEST

int main(void)

   int x;

   x = 3;
#ifdef TEST
   x += 4;
#endif
   printf("x = %d", x);

Es ist hier nicht nötig, einen Wert für eine Textersetzung anzugeben, da nur die Existenz der Definition von TEST abgefragt wird. Es gibt keine Stelle, an der der Text TEST durch einen anderen Wert ersetzt werden soll. Die Ausgabe des Programms solle die Wirkungsweise verdeutlichen.

#if

Soll der Preprozessor auch einen Ausdruck auswerten, kann statt der ifdef Anweisung die if Anweisung verwendet werden. Hiermit kann z.B. auch der Wert eines mit define definierten Names abgefragt werden. Um mehrere Bedingungen der Reihe nach abzufragen, gibt es die elif Anweisung.

#if SYSTEM == SYSV
   #define HDR "sysv.h"
#elif SYSTEM == BSD
   #define HDR "bsd.h"
#elif SYSTEM == TOS
   #define HDR "tos.h"
#else
   #define HDR "default.h"
#endif

Und als ein weiteres Beispiel folgt das obige Beispiel mit den Flag TEST.

#define TEST 1

int main(void)

   int x;

   x = 3;
#if TEST == 1
   x += 4;
#endif
   printf("x = %d", x);

Das gleiche Beispiel wie oben prüft hier nicht die Existenz sondern den Wert von TEST.

#pragma

Mit der Pragma Anweisung können Compilerspezifische Anweisungen ausgeführt werden. Dies könnten z.B. Einstellungen des Comilers sein.



Home Inhaltsverzeichnis Cookie Jar defines für den Cookie Jar


Best viewed with any browser English version not yet available.

Änderungen und Irrtümer vorbehalten. Letzte Änderung:
14 September 2001.
Home - Mail an den Webmaster - Impressum