Suche
Suche Menü

Bedingte Kompilierung

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