CLI фреймворки для C++: как создать консольное приложение с нуля

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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                    

Рекомендаций