CLI фреймворки для C++: пишем консольные приложения быстро и удобно
Создание качественного интерфейса командной строки (CLI) — важная часть разработки на C++. Ручной разбор аргументов через argc/argv и getopt быстро становится громоздким и подверженным ошибкам, особенно при большом количестве опций. На помощь приходят специализированные библиотеки — CLI фреймворки. Они автоматизируют парсинг, генерацию справки, проверку типов и помогают писать более чистый и поддерживаемый код.
В этой статье мы рассмотрим три самых популярных и современных CLI фреймворка для C++: CLI11, cxxopts и argparse. Вы узнаете их сильные стороны, увидите примеры кода и сможете выбрать подходящий инструмент для своего проекта.
1. CLI11 — современный стандарт
CLI11 — это header-only библиотека, которая заслуженно считается одним из лучших решений для C++11 и новее. Она предлагает интуитивно понятный API, мощную валидацию и автоматическую генерацию справки.
Ключевые возможности:
- Header-only: не требует сборки — достаточно подключить заголовочный файл.
- Автоматическая справка: флаги
-hи--helpработают сразу. - Валидация: встроенные и пользовательские валидаторы для аргументов (диапазон, регулярное выражение, существование файла).
- Поддержка подкоманд: идеально для сложных утилит (как
gitилиdocker). - Форматирование: настраиваемый вывод справки.
Пример использования CLI11:
Простое приложение, которое принимает имя и опциональный флаг приветствия:
#include <CLI/CLI.hpp>
#include <iostream>
int main(int argc, char** argv) {
CLI::App app{"Демонстрация CLI11"};
std::string name;
bool greet = false;
app.add_option("-n,--name", name, "Ваше имя")->required();
app.add_flag("-g,--greet", greet, "Вывести приветствие");
CLI11_PARSE(app, argc, argv);
std::cout << "Привет, " << name << "!" << std::endl;
if (greet) {
std::cout << "Хорошего дня!" << std::endl;
}
return 0;
}
Как это работает: Библиотека сама разбирает аргументы, проверяет обязательность опции --name и генерирует справку при вызове ./app --help.
2. cxxopts — простота и легковесность
cxxopts — ещё одна header-only библиотека, ориентированная на минимализм и простоту. Она отлично подходит для небольших утилит, где не нужны подкоманды, но важна читаемость кода.
Ключевые возможности:
- Простой API: добавление опций через цепочки вызовов.
- Автоматическое преобразование типов:
int,double,stringи другие. - Поддержка позиционных аргументов.
- Настраиваемые префиксы: можно использовать
-или--.
Пример использования cxxopts:
#include <cxxopts.hpp>
#include <iostream>
int main(int argc, char** argv) {
cxxopts::Options options("myapp", "Пример cxxopts");
options.add_options()
("f,file", "Имя файла", cxxopts::value<std::string>())
("v,verbose", "Подробный вывод", cxxopts::value<bool>()->default_value("false"))
("h,help", "Показать справку");
auto result = options.parse(argc, argv);
if (result.count("help")) {
std::cout << options.help() << std::endl;
return 0;
}
if (result.count("file")) {
std::cout << "Файл: " << result["file"].as<std::string>() << std::endl