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

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

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

Начать курс

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                    

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