Конфигурация приложений на C++: обзор инструментов и библиотек
Современные C++ приложения редко обходятся без внешних настроек. Конфигурационные файлы позволяют изменять поведение программы без перекомпиляции: от путей к ресурсам и параметров подключения к БД до выбора алгоритмов и включения/отключения функций. В этой статье мы рассмотрим четыре популярных инструмента для работы с конфигурацией на C++: Boost.Program_options, libconfig, nlohmann/json и yaml-cpp.
1. Boost.Program_options — универсальный парсер командной строки и конфигов
Boost.Program_options — часть библиотеки Boost. Позволяет единообразно обрабатывать аргументы командной строки, переменные окружения и конфигурационные файлы. Поддерживает несколько форматов (INI, простые текстовые), но не JSON/YAML.
Основные возможности:
- Автоматическая генерация справки (
--help); - Валидация типов (int, double, string, vector);
- Иерархические опции (группы);
- Чтение из нескольких источников с приоритетом.
Пример использования (чтение из 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("Конфигурация");
config.add_options()
("database.host", po::value<std::string>()->default_value("localhost"), "Хост БД")
("database.port", po::value<int>()->default_value(3306), "Порт БД")
("logging.level", po::value<std::string>()->default_value("info"), "Уровень лога");
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 << "Хост: " << vm["database.host"].as<std::string>() << "\n";
std::cout << "Порт: " << vm["database.port"].as<int>() << "\n";
return 0;
}
2. libconfig — легковесная библиотека с собственным форматом
libconfig — библиотека на C (с C++ обёрткой) с собственным компактным форматом конфигов. Поддерживает иерархию, массивы, группы, комментарии. Отличается высокой скоростью парсинга.
Формат файла (пример app.cfg):
database = {
host = "localhost";
port = 3306;
users = [ "admin", "guest" ];
};
logging = {
level = "info";
file = "/var/log/app.log";
};
Пример чтения на 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 << "Подключение к " << host << ":" << port << "\n";
} catch (const libconfig::FileIOException &e) {
std::cerr << "Ошибка чтения файла\n";
} catch (const libconfig::ParseException &e) {
std::cerr << "Ошибка парсинга: " << e.what() << "\n";
}
return 0;
}
3. nlohmann/json — современный парсер JSON
Библиотека nlohmann/json (JSON for Modern C++) — одна из самых популярных. Работает с форматом JSON, который широко используется в веб-приложениях и микросервисах. Отличается интуитивным синтаксисом (оператор [], итераторы).
Пример чтения 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::string host = data["database"]["host"];
int port = data["database"]["port"];
// Обход массива
for (auto& user : data["database"]["users"]) {
std::cout << "Пользователь: Также в библиотеке
Работа с XML в C# (.NET): полное руководство по парсингу и созданию
FastEndpoints для C# (.NET): полное руководство с примерами
Обработка и редактирование изображений на TypeScript: Jimp, Sharp, Canvas
Elasticsearch клиент для Node.js: @elastic/elasticsearch
Retrofit для Java: полное руководство с примерами