Configuration d'applications en C++ : aperçu des outils et bibliothèques
Les applications C++ modernes se passent rarement de paramètres externes. Les fichiers de configuration permettent de modifier le comportement du programme sans recompilation : des chemins vers les ressources et paramètres de connexion à la base de données jusqu'au choix d'algorithmes et à l'activation/désactivation de fonctionnalités. Dans cet article, nous examinerons quatre outils populaires pour travailler avec la configuration en C++ : Boost.Program_options, libconfig, nlohmann/json et yaml-cpp.
1. Boost.Program_options — analyseur universel de ligne de commande et de configs
Boost.Program_options fait partie de la bibliothèque Boost. Il permet de traiter de manière uniforme les arguments de ligne de commande, les variables d'environnement et les fichiers de configuration. Il prend en charge plusieurs formats (INI, textes simples), mais pas JSON/YAML.
Fonctionnalités principales :
- Génération automatique de l'aide (
--help); - Validation des types (int, double, string, vector);
- Options hiérarchiques (groupes);
- Lecture à partir de plusieurs sources avec priorité.
Exemple d'utilisation (lecture depuis un fichier INI) :
#include <boost/program_options.hpp>#include <iostream>#include <fstream>
namespace po = boost::program_options;
int main(int argc, char* argv[]) { po::options_description config("Configuration"); config.add_options() ("database.host", po::value<std::string>()->default_value("localhost"), "Hôte BD") ("database.port", po::value<int>()->default_value(3306), "Port BD") ("logging.level", po::value<std::string>()->default_value("info"), "Niveau de log");
po::variables_map vm; std::ifstream ifs("app.ini"); if (ifs) { po::store(po::parse_config_file(ifs, config), vm); po::notify(vm); }
std::cout << "Hôte : " << vm["database.host"].as<std::string>() << ""; std::cout << "Port : " << vm["database.port"].as<int>() << ""; return 0;}2. libconfig — bibliothèque légère avec son propre format
libconfig est une bibliothèque en C (avec une enveloppe C++) avec son propre format de configs compact. Elle prend en charge la hiérarchie, les tableaux, les groupes, les commentaires. Elle se distingue par une vitesse d'analyse élevée.
Format de fichier (exemple app.cfg) :
database = { host = "localhost"; port = 3306; users = [ "admin", "guest" ];};logging = { level = "info"; file = "/var/log/app.log";};Exemple de lecture en C++ :
#include <libconfig.h++>#include <iostream>
int main() { libconfig::Config cfg; try { cfg.readFile("app.cfg"); std::string host = cfg.lookup("database.host"); int port = cfg.lookup("database.port"); std::cout << "Connexion à " << host << ":" << port << ""; } catch (const libconfig::FileIOException &e) { std::cerr << "Erreur de lecture du fichier"; } catch (const libconfig::ParseException &e) { std::cerr << "Erreur d'analyse : " << e.what() << ""; } return 0;}3. nlohmann/json — analyseur JSON moderne
La bibliothèque nlohmann/json (JSON for Modern C++) est l'une des plus populaires. Elle fonctionne avec le format JSON, largement utilisé dans les applications web et les microservices. Elle se distingue par une syntaxe intuitive (opérateur [], itérateurs).
Exemple de lecture d'un config JSON :
#include <nlohmann/json.hpp>#include <fstream>#include <iostream>
using json = nlohmann::json;
int main() { std::ifstream f("config.json"); json data = json::parse(f);
std::strin