Bei der bedingten Kompilierung hat man die Möglichkeit, je nach Gegebenheiten bestimmte Quelltextblöcke von der Kompilierung auszuschließen oder einzubinden. Beim Debuggen des Programms kann dies von Vorteil sein. Möchte man bei seinem Programm einen Fehler suchen, eignet sich dafür ein Debug-Modus. Wenn der Debug-Modus an ist, werden zusätzliche oder andere Informationen am Bildschirm ausgegeben, welche Aufschluss über die Fehlerquelle geben könnten.
Bedingte Kompilierung bei Konstanten-Definition
Mit #ifdef und #endif kann man einen Quelltextbereich eingrenzen, der nur kompiliert wird, wenn eine bestimmte symbolische Konstante definiert wurde. Möchte man prüfen, ob eine Konstante nicht definiert ist, verwendet man #ifndef. Ein #else kann man in einen solchen Block optional auch einfügen, dieser wird dann kompiliert wenn die Bedingung in #ifdef, #ifndef oder #if (siehe unten) nicht wahr ist. In diesem Beispiel werden unterschiedliche Informationen ausgegeben, je nachdem, ob der Debug-Modus an ist oder nicht.
#include<stdio.h> #define DEBUG int main() { int a=2, b=3, ergebnis; ergebnis = (2*a) + (2*b); #ifdef DEBUG printf("* Debug: ergebnis = (2*%d) + (2*%d);\n", a, b); #else printf("Das Ergebnis ist %d\n", ergebnis); #endif return 0; }
Ausgabe, wenn eine symbolische Konstante namens DEBUG definiert wurde.
* Debug: ergebnis = (2*2) + (2*3);
Ausgabe, wenn eine symbolische Konstante namens DEBUG nicht definiert wurde.
Das Ergebnis ist 10
Bedingte Kompilierung bei bestimmten Konstanten-Wert
Das obige Beispiel kann man mit #if und #endif noch verfeinern. Mit #if kann man die symbolische Konstante noch auf einen bestimmten Wert prüfen. Setzt man die symbolische Konstante DEBUG zum Beispiel auf 0, werden keine Debug-Informationen ausgegeben. Die Werte 1 und 2 stellen dann sogenannte Debug-Level dar, bei denen dann mehr oder weniger detailiertere Informationen ausgegeben werden.
#include<stdio.h> #define DEBUG 1 int main() { int a=2, b=3, ergebnis; ergebnis = (2*a) + (2*b); #if DEBUG >= 1 printf("* Debug: ergebnis = (2*%d) + (2*%d);\n", a, b); #endif #if DEBUG >= 2 printf("* Debug: a=%d, b=%d, ergebnis=%d\n", a, b, ergebnis); #endif printf("Das Ergebnis ist %d\n", ergebnis); return 0; }
Ausgabe, wenn die symbolische Konstante namens DEBUG auf 1 gesetzt wird.
* Debug: ergebnis = (2*2) + (2*3); Das Ergebnis ist 10
Ausgabe, wenn die symbolische Konstante namens DEBUG auf 2 gesetzt wird.
* Debug: ergebnis = (2*2) + (2*3); * Debug: a=2, b=3, ergebnis=10 Das Ergebnis ist 10
Allgemeines Konstrukt
Das allgemeine Konstrukt der bedingten Kompilierung ist hier nochmals zusammengefasst. Neu ist die elseif Anweisung #elif. Diese stellt eine alternative if Anweisung dar, wenn vorangegangene if Anweisungen (#if, #elif, #ifdef, #ifndef) nicht wahr sind.
#if A==1 /* code wenn A gleich 1 ist */ #elif B==1 /* code wenn A nicht 1 ist und B gleich 1 ist */ #else /* code wenn A und B nicht 1 sind */ #endif