Trabalhando com YAML em C++: bibliotecas yaml-cpp e rapidyaml

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com YAML em C++: bibliotecas yaml-cpp e rapidyaml



YAML (YAML Ain't Markup Language) é um formato de serialização de dados amplamente utilizado para arquivos de configuração, arquivos de descrição de ambiente (Docker Compose, Kubernetes), bem como para troca de dados entre serviços. Ao contrário do JSON, o YAML é mais legível para humanos devido à indentação e ao suporte a comentários.



Em C++ não há suporte nativo a YAML, mas existem excelentes bibliotecas de terceiros. Neste artigo, abordaremos as duas mais populares: yaml-cpp (clássica, simples) e rapidyaml (moderna, muito rápida). Você aprenderá como instalar as bibliotecas, ler um arquivo YAML, criá-lo programaticamente e tratar erros típicos.



1. Biblioteca yaml-cpp



yaml-cpp é a biblioteca padrão de facto para trabalhar com YAML em C++. Ela fornece uma API conveniente, que lembra o trabalho com contêineres STL. A biblioteca suporta a especificação YAML 1.2.



Instalação



A maneira mais simples é usar o gerenciador de pacotes vcpkg ou Conan. Para Linux/macOS:



# Instalação via vcpkgvcpkg install yaml-cpp

# Instalação via Conanconan install yaml-cpp/0.7.0@


Se preferir compilar manualmente, baixe os fontes do GitHub e execute:



mkdir build && cd buildcmake ..cmake --build .sudo cmake --install .


Parsing de arquivo YAML



Suponha que temos um arquivo de configuração config.yaml:



server:  host: "localhost"  port: 8080  debug: true

database: driver: "postgresql" connection_string: "host=localhost dbname=test" pool_size: 10


Exemplo de leitura e acesso aos dados em C++:



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

int main() { try { // Carregar arquivo YAML::Node config = YAML::LoadFile("config.yaml");

// Acessar nós aninhados std::string host = config["server"]["host"].as<std::string>(); int port = config["server"]["port"].as<int>(); bool debug = config["server"]["debug"].as<bool>();

std::cout << "Server: " << host << ":" << port << " (debug=" << (debug ? "on" : "off") << ")";

// Verificar existência de chave if (config["database"]["pool_size"]) { int pool = config["database"]["pool_size"].as<int>(); std::cout << "Pool size: " << pool << ""; }

// Iterar sobre sequência (lista) // Suponha que no YAML exista o campo: hosts: ["alpha", "beta", "gamma"] // for (const auto& h : config["hosts"]) { // std::cout << "Host: " << h.as<std::string>() << ""; // }

} catch (const YAML::Exception& e) { std::cerr << "YAML parsing error: " << e.what() << ""; return 1; } catch (const std::exception& e) { std::cerr << "General error: " << e.what() << ""; return 1; } return 0;}


Criação de documento YAML



Com yaml-cpp é possível não apenas ler, mas também gerar YAML:



#include <yaml-cpp/yaml.h>#include <fstream>

int main() { YAML::Emitter out; out << YAML::BeginMap; out << YAML::Key << "application"; out << YAML::Value << "MyApp"; out << YAML::Key << "version"; out << YAML::Value << 2.5; out << YAML::Key << "features"; out << YAML::Value << YAML::BeginSeq; out << "logging" << "auth" << "cache"; ou

Recommendations