Bedingte Kompilierung
ifdef und Makros
Bedingte Kompilierung ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Der Präprozessor
Bevor der Compiler Ihren Code überhaupt sieht, läuft der Präprozessor. Er verarbeitet jede Zeile, die mit # beginnt: Includes, Makros und Bedingungen.
Mit der bedingten Kompilierung können Sie Codeblöcke abhängig von Bedingungen ein- oder ausschließen, die in dieser Phase ausgewertet werden. So entstehen aus einer Quelle verschiedene Builds.
Makros definieren
#define erstellt ein Makro. Ohne Wert ist es lediglich ein Flag, das Sie später abfragen können.
Objektähnliche Makros ersetzen einen Namen durch Text; Flags markieren einfach, dass etwas gesetzt ist.
#define MAX_USERS 100 /* value macro */
#define DEBUG /* flag macro */ifdef und ifndef
#ifdef NAME behält den Block nur bei, wenn NAME definiert ist. #ifndef behält ihn nur bei, wenn NAME nicht definiert ist.
Hier existiert die Debug-Ausgabe nur in Debug-Builds. Wenn DEBUG nicht definiert ist, sieht der Compiler diese Zeile überhaupt nicht.
#include <stdio.h>
#define DEBUG
int main(void) {
#ifdef DEBUG
printf("debug: starting\n");
#endif
printf("running\n");
return 0;
}if, elif, else
#if wertet einen konstanten ganzzahligen Ausdruck aus. Kombinieren Sie es für eine Auswahl mit mehreren Fällen mit #elif und #else.
Damit wird Code anhand eines Makros mit einer Versionsnummer ausgewählt.
#include <stdio.h>
#define VERSION 2
int main(void) {
#if VERSION >= 2
printf("new feature on\n");
#else
printf("legacy mode\n");
#endif
return 0;
}Der Operator defined
Innerhalb von #if können Sie mit defined(NAME) prüfen, ob etwas definiert ist, und Prüfungen mit && und || kombinieren.
Das ist flexibler als #ifdef, das nur einen Namen prüfen kann.
#if defined(LINUX) && !defined(EMBEDDED)
/* desktop Linux code */
#endifDefinition zur Compilezeit
Sie müssen Makros nicht fest im Quellcode vorgeben. Mit dem Flag -D definieren Sie sie in der Befehlszeile.
So schalten Build-Systeme Funktionen um, ohne den Quellcode zu bearbeiten. -DDEBUG entspricht einem #define DEBUG am Anfang jeder Datei.
gcc -DDEBUG -DVERSION=3 -o app app.cPlattformerkennung
Compiler definieren Makros vor, die das Zielsystem beschreiben. Damit können Sie portablen Code schreiben.
_WIN32— Windows (32 oder 64 Bit)__linux__— Linux__APPLE__— macOS / iOS
Verzweigen Sie anhand dieser Makros, um die passende Plattform-API aufzurufen.
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endifInclude-Guards für Header
Eine klassische Anwendung bedingter Kompilierung ist der Include-Guard, der verhindert, dass ein Header zweimal verarbeitet wird.
Beim ersten Include wird das Guard-Makro definiert. Nachfolgende Includes überspringen den Inhalt, weil das Makro bereits definiert ist.
#ifndef UTILS_H
#define UTILS_H
int add(int a, int b);
#endif /* UTILS_H */Code auskommentieren
#if 0 ... #endif deaktiviert einen Block zuverlässig, auch wenn dieser bereits Kommentare enthält.
Anders als /* */ lässt sich diese Konstruktion sicher verschachteln. Daher ist sie die übliche Methode, um Code während des Debuggens vorübergehend auszuschließen.
#if 0
legacy_function(); /* disabled for now */
/* with internal comments too */
#endifPräprozessor-Ausgabe untersuchen
Um genau zu sehen, was der Compiler kompilieren wird, führen Sie mit -E nur den Präprozessor aus.
Dadurch werden alle Includes, Makros und Bedingungen expandiert. Das ist besonders hilfreich, wenn sich ein Makro unerwartet verhält.
gcc -E app.c | lessFeature-Schalter in der Praxis
Ein gängiges Muster ist ein einzelner Konfigurations-Header, der Funktionen für das gesamte Projekt ein- oder ausschaltet.
Ändern Sie ein #define, und jeder geschützte Block in allen Dateien reagiert darauf. So bleiben optionale Funktionen sauber vom Kerncode getrennt.
#include <stdio.h>
#define FEATURE_LOGGING 1
int main(void) {
#if FEATURE_LOGGING
printf("logging enabled\n");
#endif
printf("app ready\n");
return 0;
}Schnelltest
Sagen Sie das Verhalten einer Definition in der Befehlszeile voraus.
Zusammenfassung
Sie beherrschen jetzt die bedingte Kompilierung:
#ifdef/#ifndefprüfen, ob ein Makro definiert ist#if/#elif/#elsewerten konstante Ausdrücke aus, zusammen mitdefined()-DNAMEdefiniert Makros in der Befehlszeile, um Funktionen umzuschalten- Vordefinierte Plattformmakros ermöglichen portablen Code; Include-Guards verhindern mehrfaches Einbinden
Als Nächstes: Code über mehrere Dateien hinweg organisieren.
Häufig gestellte Fragen
Ist die Lektion „Bedingte Kompilierung“ kostenlos?
Ja — der vollständige Text von „Bedingte Kompilierung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Bedingte Kompilierung“?
ifdef und Makros Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C Academy zu starten?
Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Bedingte Kompilierung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?
Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Bedingte Kompilierung
- Projekte mit mehreren Dateien
- Makefiles
- Statische und Shared Libraries