Frameworks CLI pour C++ : de l'analyse d'arguments aux utilitaires console complets
Le développement d'utilitaires console en C++ est l'une des tâches les plus courantes pour les programmeurs. Qu'il s'agisse d'un outil de traitement de données, d'un compilateur ou d'un script DevOps — une analyse correcte des arguments de la ligne de commande est indispensable. Le traitement manuel de argc/argv se transforme rapidement en un mélange de strcmp et atoi, et la gestion des options, des drapeaux et des sous-commandes devient un cauchemar. C'est là que les frameworks CLI viennent à la rescousse — des bibliothèques qui prennent en charge toute la routine : description déclarative de l'interface, génération d'aide, validation des types et même l'autocomplétion pour le shell.
Dans cet article, nous examinerons trois solutions les plus populaires pour C++ : CLI11, cxxopts et docopt.cpp. Vous apprendrez comment créer rapidement une application console professionnelle avec un minimum d'effort.
1. CLI11 — le standard moderne
CLI11 (GitHub : CLIUtils/CLI11) est une bibliothèque header-only pour C++11/14/17. Elle est considérée comme l'étalon-or grâce à son API concise et ses capacités puissantes : prise en charge des sous-commandes imbriquées, validation des plages, options à valeurs multiples, drapeaux, arguments positionnels et génération automatique de --help.
Installation
Il suffit de copier le fichier d'en-tête CLI11.hpp dans le projet ou de l'inclure via CMake FetchContent.
Exemple : utilitaire d'archivage avec options
#include <CLI/CLI11.hpp>#include <iostream>#include <string>
int main(int argc, char** argv) { CLI::App app("Archiveur simple");
std::string input_file; std::string output_file = "archive.zip"; int compression_level = 5; bool verbose = false;
app.add_option("-i,--input", input_file, "Fichier d'entrée")->required(); app.add_option("-o,--output", output_file, "Fichier de sortie"); app.add_option("-c,--compression", compression_level, "Niveau de compression (1-9)") ->check(CLI::Range(1, 9)); app.add_flag("-v,--verbose", verbose, "Sortie détaillée");
CLI11_PARSE(app, argc, argv);
std::cout << "Archivage : " << input_file << ""; std::cout << "Sortie : " << output_file << ""; std::cout << "Niveau : " << compression_level << ""; if (verbose) std::cout << "Mode débogage activé"; return 0;}Exécution : ./archiver -i data.txt -o backup.zip -c 9 -v
En cas d'erreur ou avec --help, CLI11 affiche automatiquement une belle description.
2. cxxopts — légèreté et simplicité
cxxopts (GitHub : jarro2783/cxxopts) est une autre bibliothèque header-only. Elle est plus simple que CLI11, mais couvre 90% des besoins : options courtes/longues, valeurs par défaut, listes et aide. Idéale pour les petits utilitaires.
Exemple : lecture de configuration
#include <cxxopts.hpp>#include <iostream>
int main(int argc, char* argv[]) { cxxopts::Options options("greeter", "Programme de bienvenue");
options.add_options() ("n,name", "Nom d'utilisateur", cxxopts::value<std::string>()) ("a,age", "Âge", cxxopts::value<int>()->default_value("0")) ("v,verbose", "Sortie détaillée", cxxopts::value<bool>()->default_value("false")) ("h,help", "Aide");
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 << "Bonjour, " << name << "!"; if (verbose) std::cout << "Âge