CLI фреймворки для C++: от парсинга аргументов до полноценных консольных утилит
Разработка консольных утилит на C++ — одна из самых частых задач, с которой сталкиваются программисты. Будь то инструмент для обработки данных, компилятор или DevOps-скрипт — без грамотного парсинга аргументов командной строки не обойтись. Ручная обработка argc/argv быстро превращается в лапшу из strcmp и atoi, а поддержка опций, флагов и подкоманд становится кошмаром. Именно здесь на помощь приходят CLI фреймворки — библиотеки, которые берут на себя всю рутину: декларативное описание интерфейса, генерацию справки, валидацию типов и даже автодополнение для shell.
В этой статье мы рассмотрим три самых популярных решения для C++: CLI11, cxxopts и docopt.cpp. Вы узнаете, как быстро создать профессиональное консольное приложение с минимальными усилиями.
1. CLI11 — современный стандарт
CLI11 (GitHub: CLIUtils/CLI11) — это header-only библиотека для C++11/14/17. Она считается золотым стандартом благодаря лаконичному API и мощным возможностям: поддержка вложенных подкоманд, валидация диапазонов, опции с несколькими значениями, флаги, позиционные аргументы и автоматическая генерация --help.
Установка
Достаточно скопировать заголовочный файл CLI11.hpp в проект или подключить через CMake FetchContent.
Пример: утилита для архивации с опциями
#include <CLI/CLI11.hpp>
#include <iostream>
#include <string>
int main(int argc, char** argv) {
CLI::App app("Простой архиватор");
std::string input_file;
std::string output_file = "archive.zip";
int compression_level = 5;
bool verbose = false;
app.add_option("-i,--input", input_file, "Входной файл")->required();
app.add_option("-o,--output", output_file, "Выходной файл");
app.add_option("-c,--compression", compression_level, "Уровень сжатия (1-9)")
->check(CLI::Range(1, 9));
app.add_flag("-v,--verbose", verbose, "Подробный вывод");
CLI11_PARSE(app, argc, argv);
std::cout << "Архивируем: " << input_file << "\n";
std::cout << "Выход: " << output_file << "\n";
std::cout << "Уровень: " << compression_level << "\n";
if (verbose) std::cout << "Режим отладки включён\n";
return 0;
}
Запуск: ./archiver -i data.txt -o backup.zip -c 9 -v
При ошибке или --help CLI11 сам выведет красивое описание.
2. cxxopts — лёгкость и простота
cxxopts (GitHub: jarro2783/cxxopts) — ещё одна header-only библиотека. Она проще CLI11, но при этом покрывает 90% потребностей: короткие/длинные опции, значения по умолчанию, списки и help. Идеально для небольших утилит.
Пример: чтение конфигурации
#include <cxxopts.hpp>
#include <iostream>
int main(int argc, char* argv[]) {
cxxopts::Options options("greeter", "Приветственная программа");
options.add_options()
("n,name", "Имя пользователя", cxxopts::value<std::string>())
("a,age", "Возраст", cxxopts::value<int>()->default_value("0"))
("v,verbose", "Подробный вывод", cxxopts::value<bool>()->default_value("false"))
("h,help", "Справка");
auto result = options.parse(argc, argv);
if (result.count("help")) {
std::cout << options.help() << "\n";
return 0;
}
std::string name = result["name"].as<std::string>();
int age = result["age"].as<int>();
bool verbose = result["verbose"].as<bool>();
std::cout << "Привет, " << name << "!\n";
if (verbose) std::cout << "Возраст: " << age << "\n