Direktiven #if, #elif, #else, #endif
#if ausdruck /* Unvollständige Alternative */
textblock
#endif
Liefert ausdruck einen Wert ungleich Null ("wahr"), dann wird
textblock vom Präprozessor dem Compiler übergeben.
#if ausdruck /* Vollständige Alternative */
textblock_1
#else
textblock_2
#endif
Liefert ausdruck einen Wert ungleich Null ("wahr"), dann wird
textblock_1 vom Präprozessor dem Compiler übergeben.
Liefert ausdruck dagegen den Wert 0 ("falsch"), dann wird
textblock_2 übergeben. Auch Mehrfachverzweigungen können formuliert werden:
#if ausdruck_1
textblock_1
#elif ausdruck_2 /* else if */
textblock_2
. . .
#else
textblock_n
#endif
Jede #if-Direktive in einer Quelltextdatei muß mit einem korrespondierenden
#endif abgeschlossen sein. Zwischen #if und #endif kann eine beliebige Zahl
von #elif-Direktiven, aber nur eine einzige #else-Direktive erscheinen.
Ein #else muß grundsätzlich die letzte Direktive vor dem jeweils
abschließenden #endif darstellen.
#if, #elif, #else und #endif lassen sich als Teile anderer #if-Konstrukte
formulieren, wobei der Präprozessor #else, #elif und #endif jeweils dem
letzten #if zuordnet, für das noch keine derartige Direktive erschienen
ist.
Der Präprozessor wählt einen Textblock aus, indem er so lange den
Ausdruck der einzelnen #if- und #elif-Direktiven auswertet, bis einer dieser
Ausdrücke einen Wert ungleich 0 ergibt. Eine ausgewählte Gruppe
umfaßt den gesamten Text bis zum korrespondierenden #elif, #else oder
#endif, wobei dieser Text durchaus auch andere Präprozessor-Direktiven
enthalten kann, die der Präprozessor vor der Übergabe der Gruppe
an den Compiler auf normale Weise bearbeitet.
Durch #if, #elif, #else und #endif ausgeschlossene Gruppen eines Quelltexts werden so behandelt, als seien sie nicht vorhanden.
Der Ausdruck kann einen beliebigen Ausdruck darstellen, der während der
Compilierung allerdings einen konstanten Wert ergeben muß.
Der Operator sizeof ist innerhalb des Ausdrucks nicht anwendbar.
Nicht zulässig sind auch explizite Typumwandlungen und
Gleitpunktwerte.
Der Textblock kann eine beliebige Kombination von Sprachanweisungen und Präprozessor-Direktiven enthalten.