#if

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.

#include <stdio.h> #define ARRAY_SIZE 10000000 int main(){ #if ARRAY_SIZE > 1000 printf("Large array\n"); #endif return 0; }

Large array

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:

#if ARRAY_SIZE > 1000 #if ARRAY_SIZE > 100000 printf("Very large array\n"); #else printf("Large array\n"); #endif #endif

Very large array

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:

  • Integrale Konstanten: Integrale 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 definiert, es ist jedoch vom Gebrauch dieser Konstanten abzuraten.
  • Erlaubt sind die üblichen arithmetischen Operatoren +, -, *, /, %, sowie &&, ||, !, &, |, ^, ~. Auch erlaubt sind Vergleichsoperatoren ==, !=, >, >=, <, <=, sowie 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 Parameter aufgerufen werden, werden ebenfalls als undefiniert behandelt.
  • Zur Prüfung einer Makro-Definition ist zusätzlich die defined-Direktive erlaubt.