|
|
| (Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) |
| Zeile 10: |
Zeile 10: |
| *[[Makros]] | | *[[Makros]] |
| *[[Kommentare]] | | *[[Kommentare]] |
| == Bedingte Kompilierung ==
| |
| Bedingte Kompilierung mit dem GCC-Compiler (GNU Compiler Collection) ist eine Technik, die es ermöglicht, bestimmte Teile des Codes abhängig von definierten Bedingungen zu kompilieren oder auszulassen. Dies ist besonders nützlich, um plattform- oder konfigurationsspezifischen Code zu schreiben und zu verwalten, Debugging zu aktivieren oder zu deaktivieren, oder experimentelle Funktionen einzuschließen.
| |
|
| |
|
| Hier sind die wichtigsten Aspekte der bedingten Kompilierung im Zusammenhang mit GCC:
| | ----- |
|
| |
|
| === Präprozessor-Direktiven für Bedingte Kompilierung === | | {| style="width: 100%; |
| '''#if''','''#else''' und '''#endif''': Diese Präprozessor-Direktiven werden verwendet, um Codeblöcke basierend auf Bedingungen ein- oder auszuschließen.
| | | style="width: 33%;" | [[GNU Assembler|< Zurück (GNU Assembler)]] |
| | | | style="width: 33%; text-align:center;" | [[Hauptseite|< Hauptseite >]] |
| <syntaxhighlight lang="C">
| | | style="width: 33%; text-align:right;" | [[Geschichte und Entwicklung|Weiter (Geschichte und Entwicklung) >]] |
| #if defined(DEBUG)
| | |} |
| // Code wird nur kompiliert, wenn DEBUG definiert ist
| |
| printf("Debug mode\n");
| |
| #else
| |
| // Alternativer Code wird kompiliert, wenn DEBUG nicht definiert ist
| |
| printf("Production mode\n");
| |
| #endif
| |
| <\syntaxhighlight>
| |
| '''#ifdef''' und '''#ifndef''': Diese Direktiven prüfen, ob ein Symbol definiert ist oder nicht.
| |
| <syntaxhighlight lang="C">
| |
| #ifdef DEBUG
| |
| // Dieser Code wird kompiliert, wenn DEBUG definiert ist
| |
| printf("Debug mode\n");
| |
| #endif
| |
| | |
| #ifndef RELEASE
| |
| // Dieser Code wird kompiliert, wenn RELEASE nicht definiert ist
| |
| printf("Not in release mode\n");
| |
| #endif
| |
| <\syntaxhighlight>
| |
| '''#elif''': Diese Direktive ermöglicht zusätzliche Bedingungen innerhalb einer #if-Kette.
| |
| <syntaxhighlight lang="C"> | |
| #if LEVEL == 1
| |
| printf("Level 1\n");
| |
| #elif LEVEL == 2
| |
| printf("Level 2\n");
| |
| #else
| |
| printf("Other level\n");
| |
| #endif
| |
| <\syntaxhighlight>
| |
| '''#define''' und '''#undef''': Verwenden Sie diese Direktiven, um Symbole zu definieren oder deren Definition aufzuheben.
| |
| <syntaxhighlight lang="C">
| |
| #define FEATURE_X
| |
| #undef FEATURE_X
| |
| <\syntaxhighlight>
| |
| | |
| === Praktische Anwendungen ===
| |
| ==== Debugging und Entwicklungsmodi ====
| |
| Bedingte Kompilierung ist besonders nützlich, um Debugging-Funktionalitäten ein- oder auszuschalten:
| |
| <syntaxhighlight lang="C">
| |
| #include <stdio.h>
| |
| | |
| #define DEBUG
| |
| | |
| int main() {
| |
| int val = 42;
| |
| | |
| #ifdef DEBUG
| |
| printf("Debug: val = %d\n", val);
| |
| #else
| |
| printf("Release: val = %d\n", val);
| |
| #endif
| |
| | |
| return 0;
| |
| }
| |
| <\syntaxhighlight>
| |
| Wenn das Symbol DEBUG definiert ist, wird die Debugging-Ausgabe aktiviert. Andernfalls wird die Release-Ausgabe verwendet.
| |
| | |
| ==== Plattformübergreifende Kompilierung ====
| |
| Bedingte Kompilierung kann verwendet werden, um spezifischen Code für verschiedene Betriebssysteme oder Architekturen zu schreiben:
| |
| <syntaxhighlight lang="C">
| |
| #include <stdio.h>
| |
| | |
| int main() {
| |
| #ifdef _WIN32
| |
| printf("Running on Windows\n");
| |
| #elif __linux__
| |
| printf("Running on Linux\n");
| |
| #elif __APPLE__
| |
| printf("Running on macOS\n");
| |
| #else
| |
| printf("Unknown Platform\n");
| |
| #endif
| |
| | |
| return 0;
| |
| }
| |
| <\syntaxhighlight>
| |
| Hier wird basierend auf dem Zielbetriebssystem unterschiedlicher Code kompiliert.
| |
| | |
| ==== Feature-Toggles ====
| |
| Mit bedingter Kompilierung können Funktionen basierend auf definierten Symbolen aktiviert oder deaktiviert werden:
| |
| <syntaxhighlight lang="C">
| |
| #include <stdio.h>
| |
| | |
| #define FEATURE_X
| |
| | |
| int main() {
| |
| #ifdef FEATURE_X
| |
| printf("Feature X is enabled\n");
| |
| #else
| |
| printf("Feature X is disabled\n");
| |
| #endif
| |
| | |
| return 0;
| |
| }
| |
| <\syntaxhighlight>
| |
| Je nachdem, ob FEATURE_X definiert ist oder nicht, wird der entsprechende Code kompiliert.
| |
| | |
| ==== Kompilierungsflags mit GCC ====
| |
| Symbole können direkt beim Aufruf des Compilers definiert oder entfernt werden, was die Flexibilität erhöht:
| |
| <syntaxhighlight lang="Shell">
| |
| gcc -DDEBUG -o myprogram myprogram.c
| |
| <\syntaxhighlight>
| |
| Hier definiert -DDEBUG das Symbol DEBUG während der Kompilierung.
| |
| | |
| ===== Beispiel für Kompilierung mit GCC =====
| |
| Angenommen, wir haben den folgenden C-Code:
| |
| <syntaxhighlight lang="C">
| |
| #include <stdio.h>
| |
| | |
| int main() {
| |
| #ifdef DEBUG
| |
| printf("Debug mode enabled\n");
| |
| #else
| |
| printf("Production mode\n");
| |
| #endif
| |
| | |
| return 0;
| |
| } | |
| <\syntaxhighlight>
| |
| Wir können den Code mit und ohne Debugging-Informationen kompilieren:
| |
| | |
| Mit Debugging:
| |
| <syntaxhighlight lang="Shell">
| |
| gcc -DDEBUG -o myprogram myprogram.c
| |
| ./myprogram # Ausgabe: Debug mode enabled
| |
| <\syntaxhighlight>
| |
| Ohne Debugging:
| |
| <syntaxhighlight lang="Shell">
| |
| gcc -o myprogram myprogram.c
| |
| ./myprogram # Ausgabe: Production mode
| |
| <\syntaxhighlight>
| |