>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
C-plus-plus

Dompter le YAML dans vos projets C++

Imaginez que vous rédigez une configuration pour votre application. Le JSON semble trop strict avec ses guillemets et ses crochets, le XML est un vestige du passé, et les fichiers .ini ne permettent pas de gérer l'imbrication complexe. C'est là que le YAML entre en scène. Il est élégant, lisible, et... sacrément difficile à parser si vous essayez de développer une solution vous-même.

Si vous travaillez avec C++, vous avez probablement entendu parler de yaml-cpp. C'est sans doute l'outil le plus populaire pour travailler avec ce format. Le projet existe sur GitHub depuis plus de dix ans, a amassé plus de 6 000 étoiles, et est devenu la norme de facto pour de nombreux systèmes majeurs, notamment ROS (Robot Operating System).

Ce que c'est et pourquoi vous en avez besoin

yaml-cpp est une bibliothèque capable de convertir des fichiers YAML en objets C++ et inversement. L'avantage principal est qu'elle supporte entièrement la spécification YAML 1.2. Cela signifie que tous les éléments « complexes » comme les anchors, les alias ou les blocs multilignes seront gérés correctement.

À qui s'adresse-t-elle ? Avant tout, à ceux qui en ont marre des formats de configuration rigides. Le YAML permet de rédiger des configurations agréables à lire, et yaml-cpp s'occupe de tout le travail de parsing.

Comment ça fonctionne en pratique

La bibliothèque offre une API intuitive qui ressemble un peu à travailler avec std::map ou les bibliothèques JSON populaires. Pas besoin d'itérer manuellement sur les tokens—vous accédez simplement aux nœuds par leurs clés.

Lecture des données

Disons que nous avons un fichier config.yaml :

last_login: 2023-10-27
user:
  name: "Ivan"
  roles: [admin, editor]

Dans le code, cela se transforme en une construction élégante :

#include "yaml-cpp/yaml.h"
#include <iostream>

int main() {
    YAML::Node config = YAML::LoadFile("config.yaml");

    if (config["user"]) {
        std::string name = config["user"]["name"].as<std::string>();
        std::cout << "Привет, " << name << "!\n";
    }

    // Можно даже итерироваться по спискам
    for (auto role : config["user"]["roles"]) {
        std::cout << "Роль: " << role.as<std::string>() << "\n";
    }
}

Créer du YAML à partir de zéro

Générer des documents (émission) fonctionne tout aussi simplement. Vous construisez un arbre d'objets, et la bibliothèque s'occupe de l'indentation et du formatage :

YAML::Emitter out;
out << YAML::BeginMap;
out << YAML::Key << "pi";
out << YAML::Value << 3.14159;
out << YAML::EndMap;

std::cout << out.c_str();

Subtilités d'intégration et de compilation

Le projet utilise CMake, donc l'intégration ne pose généralement pas de problèmes. L'approche la plus moderne est d'utiliser FetchContent. Cela élimine le besoin de télécharger manuellement les sources ou de gérer des submodules git. Vous ajoutez simplement quelques lignes à votre CMakeLists.txt, et CMake récupérera la version requise de la bibliothèque lors de la compilation du projet.

Un point intéressant : par défaut, yaml-cpp est compilé en tant que bibliothèque statique. Si vous avez besoin d'une bibliothèque dynamique (.so ou .dll), vous devrez explicitement passer le flag -DYAML_BUILD_SHARED_LIBS=ON.

D'ailleurs, si vous utilisez GCC et que vous aimez déboguer avec le flag _GLIBCXX_DEBUG, faites attention. La bibliothèque est sensible à ce flag : yaml-cpp lui-même et votre projet doivent être compilés avec les mêmes paramètres de debug de la bibliothèque standard, sinon vous pourriez rencontrer des segmentation faults étranges sans raison apparente.

Y a-t-il des pièges ?

Malgré son statut de « standard », yaml-cpp a ses propres bizarreries. La documentation dans le dépôt lui-même est assez laconique ; les infos principales sont enfouies dans le Wiki ou les rapports CodeDocs auto-générés.

Gardez aussi à l'esprit le changement d'API. Les versions antérieures à 0.5.0 utilisaient l'ancienne interface, qui est maintenant considérée comme obsolète. Si vous maintenez un ancien projet legacy, vous pourriez avoir besoin de la branche 0.3.x, mais les développeurs préviennent : en 2026, le support de l'ancienne API prendra fin complètement.

Qui devrait l'essayer

Si vous démarrez un nouveau projet C++ et avez besoin d'un endroit pour stocker des paramètres—allez-y avec yaml-cpp. C'est une solution fiable, éprouvée par le temps. Elle fonctionne très bien pour :

  • Les moteurs de jeux (descriptions de niveaux, paramètres de personnages).
  • Les utilitaires système avec des tonnes de flags.
  • La robotique et les systèmes embarqués, où le YAML est déjà devenu la norme.

Pour les tout petits projets, la bibliothèque peut sembler un peu lourde, mais pour le confort d'écriture et de lecture des configurations, c'est un prix parfaitement acceptable. Par où commencer ? Consultez simplement le tutoriel dans le Wiki du projet—tous les exemples de base sont là, suffisants pour 90 % des tâches.

Projets similaires