C-Präprozessor & Makros: #include, #define & bedingte Kompilierung meistern
C-Präprozessor & Makros
Entdecken Sie die Macht von C's Präprozessor: Lernen Sie, Header-Dateien einzubinden, Konstanten und Funktionen zu definieren und den Kompilierungsfluss mit bedingten Direktiven zu steuern.

Der C-Präprozessor läuft vor dem Compiler und transformiert Ihren Quellcode, indem er Makros expandiert, Header-Dateien einbindet und bedingte Anweisungen auswertet. Er ist ein unverzichtbares Werkzeug für flexiblen, wiederverwendbaren Code.
Alle Präprozessor-Direktiven beginnen mit einem #-Symbol. Zum Beispiel:
#define PI 3.14
Header-Dateien einbinden: #include
Die #include-Direktive fügt den Inhalt einer Header-Datei direkt in Ihre Quelldatei ein. Häufige Verwendung:
#include <stdio.h>
Ohne #include <stdio.h> wären Funktionen wie printf() und scanf() undefiniert. Sie können auch benutzerdefinierte Header erstellen:
#include "my_header.h"
Benutzerdefinierte Header eignen sich, um verwandte Funktionsdeklarationen und Konstanten zu gruppieren.
Konstanten und Ausdrücke definieren: #define
Ein Makro ersetzt ein Token oder einen Ausdruck durch einen Wert vor der Kompilierung. Beispiel:
#define c 299792458 /* Lichtgeschwindigkeit */
Die Verwendung von c an beliebiger Stelle in Ihrem Programm expandiert zu 299792458.
Beispiel 1: PI definieren
#include <stdio.h>
#define PI 3.1415
int main() {
float radius, area;
printf("Enter the radius: ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("Area=%.2f", area);
return 0;
}
Funktionsähnliche Makros
Makros können Argumente akzeptieren und funktionieren ähnlich wie Inline-Funktionen:
#define circleArea(r) (3.1415 * (r) * (r))
Für circleArea(5) expandiert der Präprozessor zu (3.1415 * 5 * 5).
Beispiel 2: Funktionsähnliches Makro verwenden
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI * (r) * (r))
int main() {
float radius, area;
printf("Enter the radius: ");
scanf("%f", &radius);
area = circleArea(radius);
printf("Area = %.2f", area);
return 0;
}
Bedingte Kompilierung
Bedingte Direktiven lassen Sie Codeblöcke zur Kompilierzeit ein- oder ausschließen, ähnlich wie if-Anweisungen, aber vor der Ausführung evaluiert.
Häufige Anwendungsfälle
- Verschiedene Betriebssysteme oder Hardware ansprechen.
- Debug-Builds ohne Laufzeit-Overhead erstellen.
- Legacy-Code-Pfade für Referenzzwecke beibehalten.
Wichtige Direktiven
#ifdef MACRO /* Code wenn MACRO definiert ist */ #endif
#if EXPRESSION /* Code wenn EXPRESSION ungleich Null */ #else /* Code wenn EXPRESSION Null */ #endif
#if EXPRESSION /* code */ #elif ANOTHER_EXPRESSION /* alternativer code */ #else /* fallback code */ #endif
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 /* buffer ist groß genug */ #endif
Vordefinierte Makros
| Makro | Wert |
|---|---|
__DATE__ | String des aktuellen Kompilierungsdatums |
__FILE__ | String des aktuellen Dateinamens |
__LINE__ | Zeilennummer, an der das Makro erscheint |
__STDC__ | Ungleich Null, wenn der Compiler dem ANSI-C-Standard folgt |
__TIME__ | String der aktuellen Kompilierungszeit |
Beispiel 3: Kompilierungszeit anzeigen
#include <stdio.h>
int main() {
printf("Current time: %s", __TIME__);
return 0;
}
Ausgabe-Beispiel:
Current time: 19:54:39
Empfohlene Weiterführende Themen
- Line Control
- Pragmas
- Preprocessor Output
- Other Directives
C Sprache
- Umfassende Zusammenfassung: Widerstände, Spulen und Kondensatoren in AC-Kreisen
- C# Keywords und Identifiers verstehen: Regeln, Listen und Best Practices
- C# Klassen & Objekte: Fundamente für robustes OOP
- C# Abstrakte Klassen & Methoden meistern: Praktischer Leitfaden
- C# Partielle Klassen und Methoden verstehen
- Versiegelte Klassen und Methoden in C# meistern
- C#-Präprozessordirektiven meistern: Ein praktischer Leitfaden
- C Schlüsselwörter & Bezeichner: Ein praktischer Leitfaden
- C-Konstanten und Literale: Typen, Verwendung & Best Practices
- Eingabe und Ausgabe in C meistern: scanf, printf & Co.