CLI-Frameworks für C++: Vom Argument-Parsing bis zu vollwertigen Konsolen-Dienstprogrammen
Die Entwicklung von Konsolen-Dienstprogrammen in C++ ist eine der häufigsten Aufgaben, mit denen Programmierer konfrontiert werden. Ob es sich um ein Tool zur Datenverarbeitung, einen Compiler oder ein DevOps-Skript handelt – ohne ein ordentliches Parsing von Kommandozeilen-Argumenten kommt man nicht aus. Die manuelle Verarbeitung von argc/argv verwandelt sich schnell in einen Spaghetti-Code aus strcmp und atoi, und die Unterstützung von Optionen, Flags und Unterbefehlen wird zum Albtraum. Genau hier kommen CLI-Frameworks ins Spiel – Bibliotheken, die die gesamte Routine übernehmen: deklarative Beschreibung der Schnittstelle, Generierung von Hilfetexten, Typvalidierung und sogar Autovervollständigung für die Shell.
In diesem Artikel betrachten wir die drei beliebtesten Lösungen für C++: CLI11, cxxopts und docopt.cpp. Sie erfahren, wie Sie schnell eine professionelle Konsolenanwendung mit minimalem Aufwand erstellen.
1. CLI11 – Der moderne Standard
CLI11 (GitHub: CLIUtils/CLI11) ist eine Header-Only-Bibliothek für C++11/14/17. Sie gilt aufgrund ihrer prägnanten API und leistungsstarken Funktionen als Goldstandard: Unterstützung für verschachtelte Unterbefehle, Bereichsvalidierung, Optionen mit mehreren Werten, Flags, Positionsargumente und automatische Generierung von --help.
Installation
Es reicht aus, die Header-Datei CLI11.hpp in das Projekt zu kopieren oder über CMake FetchContent einzubinden.
Beispiel: Dienstprogramm zur Archivierung mit Optionen
#include <CLI/CLI11.hpp>#include <iostream>#include <string>
int main(int argc, char** argv) { CLI::App app("Einfacher Archiver");
std::string input_file; std::string output_file = "archive.zip"; int compression_level = 5; bool verbose = false;
app.add_option("-i,--input", input_file, "Eingabedatei")->required(); app.add_option("-o,--output", output_file, "Ausgabedatei"); app.add_option("-c,--compression", compression_level, "Komprimierungsstufe (1-9)") ->check(CLI::Range(1, 9)); app.add_flag("-v,--verbose", verbose, "Ausführliche Ausgabe");
CLI11_PARSE(app, argc, argv);
std::cout << "Archiviere: " << input_file << ""; std::cout << "Ausgabe: " << output_file << ""; std::cout << "Stufe: " << compression_level << ""; if (verbose) std::cout << "Debug-Modus aktiviert"; return 0;}Aufruf: ./archiver -i data.txt -o backup.zip -c 9 -v
Bei einem Fehler oder --help gibt CLI11 selbstständig eine schöne Beschreibung aus.
2. cxxopts – Leichtigkeit und Einfachheit
cxxopts (GitHub: jarro2783/cxxopts) ist eine weitere Header-Only-Bibliothek. Sie ist einfacher als CLI11, deckt aber 90% der Anforderungen ab: kurze/lange Optionen, Standardwerte, Listen und Hilfe. Ideal für kleine Dienstprogramme.
Beispiel: Konfiguration lesen
#include <cxxopts.hpp>#include <iostream>
int main(int argc, char* argv[]) { cxxopts::Options options("greeter", "Begrüßungsprogramm");
options.add_options() ("n,name", "Benutzername", cxxopts::value<std::string>()) ("a,age", "Alter", cxxopts::value<int>()->default_value("0")) ("v,verbose", "Ausführliche Ausgabe", cxxopts::value<bool>()->default_value("false")) ("h,help", "Hilfe");
auto result = options.parse(argc, argv);
if (result.count("help")) { std::cout << options.help() << ""; return 0; }
std::string name = result["name"].as<std::string>(); int age = result["age"].as<int>(); bool verbose = result["verbose"].as<bool>();
std::cout << "Hallo, " << name << "!"; if (verbose) std::cout << "Alter Auch in der Bibliothek
Swagger/OpenAPI Generierung für Swift: Werkzeuge und Bibliotheken
Aufgabenwarteschlangen für Swift: Vollständiger Leitfaden zu GCD und Operation Queues
Juniper: Elegante GraphQL-Bibliothek in Rust für moderne Webanwendungen
Elasticsearch-Client für Java: Vollständige Anleitung zur Arbeit mit dem Java Client
Dependency Injection Container für C# (.NET) — vollständige Anleitung