0Pricing
C Academy · Lektion

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 */
#endif

Definition 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.c

Plattformerkennung

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>
#endif

Include-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 */
#endif

Prä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 | less

Feature-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/#ifndef prüfen, ob ein Makro definiert ist
  • #if/#elif/#else werten konstante Ausdrücke aus, zusammen mit defined()
  • -DNAME definiert 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

  1. Bedingte Kompilierung
  2. Projekte mit mehreren Dateien
  3. Makefiles
  4. Statische und Shared Libraries
← Zurück zu C Academy