#if
-Direktive
Die #if
-Direktive leitet eine bedingte Compilierung ein. Je nachdem, ob die Bedingung des ausgewerten Ausdrucks erfüllt wird, wird der nachfolgende Codeblock compiliert oder aber komplett weggelassen.
Als Codeblock gilt derjenige Teil zwischen den zusammengehörigen #if
-, #else
-, #elif
-, #ifdef
-, #ifndef
- und #endif
-Direktiven. Ein Codeblock kann weitere bedingte Compilierungen enthalten, Verschachtelungen sind erlaubt:
Details
Die Auswertung des Ausdruckes ist nicht wie normale Programmierung zu interpretieren. Bibliotheksfunktionen wie beispielsweise mathematische Berechungen können nicht ausgeführt werden. Folgende Elemente können in einem Prüf-Ausdruck vorkommen:
- Integer-Konstanten: Integer-Konstanten sind Zahlen ohne Nachkommastellen, beispielsweise
0
, 1234
, -352
. Zusätzlich sind auch Oktalzahlen (mit führender 0) und Hexadezimalzahlen (mit führendem 0x
) erlaubt. Der Wert 0
wird bei finaler Auswertung als false
interpretiert, alle anderen Werte als true
.
- Buchstaben-Konstanten: Buchstabenkonstanten werden mit einfachen Anführungs- und Schlusszeichen geschrieben, beispielsweise
'a'
und in den entsprechenden ASCII-Code umgewandelt. Einige Compiler erlauben mehrere Buchstaben innerhalb der Anführungszeichen, um grössere Werte zu simulieren, davon ist jedoch abzuraten. Bei finaler Auswertung werden alle Codes als true
betrachtet mit Ausnahme des Null-Zeichens '\0'
.
- Die boolschen Konstanten
false
und true
(nur kleingeschrieben) sind bei einigen Preprozessoren vordefiniert, es ist jedoch vom Gebrauch dieser Konstanten abzuraten.
- Erlaubt sind die üblichen arithmetischen Operatoren
+
, -
, *
, /
, %
, sowie die Vergleichsoperatoren ==
, !=
, >
, >=
, <
, <=
, allerdings nur für Integer-Werte. Des weiteren sind die Operatoren &&
, ||
, !
, &
, |
, ^
und ~
erlaubt sowie die Operatorenklammerung.
- Makros werden aufgelöst. jegliche Werte, die nicht-Null sind, werden als
true
behandelt. Nicht-definierte Makros werden grundsätzlich als false
behandelt. Sämtliche Namen, die keinem bekannten Makro zugeordnet werden können, werden als nicht-definiert behandelt. Parametrisierte Makros, die ohne Argumente aufgerufen werden, werden ebenfalls als undefiniert behandelt.
- Zur Prüfung einer Makro-Definition ist zusätzlich der
defined
-Operator erlaubt.