Sprachkonzepte
Preprozessor
Operatoren
Kontrollstrukturen
Typen
OOP
Bibliotheken
|
#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.
|