CLI frameworks para C++: da análise de argumentos a utilitários de console completos
O desenvolvimento de utilitários de console em C++ é uma das tarefas mais comuns que os programadores enfrentam. Seja uma ferramenta de processamento de dados, um compilador ou um script DevOps — não é possível prescindir de uma análise competente dos argumentos da linha de comando. O tratamento manual de argc/argv rapidamente se transforma em um emaranhado de strcmp e atoi, e a manutenção de opções, flags e subcomandos se torna um pesadelo. É aqui que os CLI frameworks vêm em socorro — bibliotecas que assumem toda a rotina: descrição declarativa da interface, geração de ajuda, validação de tipos e até mesmo autocompletar para o shell.
Neste artigo, veremos três soluções mais populares para C++: CLI11, cxxopts e docopt.cpp. Você aprenderá como criar rapidamente um aplicativo de console profissional com o mínimo de esforço.
1. CLI11 — o padrão moderno
CLI11 (GitHub: CLIUtils/CLI11) é uma biblioteca header-only para C++11/14/17. É considerada o padrão ouro devido à sua API concisa e recursos poderosos: suporte a subcomandos aninhados, validação de intervalos, opções com múltiplos valores, flags, argumentos posicionais e geração automática de --help.
Instalação
Basta copiar o arquivo de cabeçalho CLI11.hpp para o projeto ou conectá-lo via CMake FetchContent.
Exemplo: utilitário de arquivamento com opções
#include <CLI/CLI11.hpp>#include <iostream>#include <string>
int main(int argc, char** argv) { CLI::App app("Arquivador simples");
std::string input_file; std::string output_file = "archive.zip"; int compression_level = 5; bool verbose = false;
app.add_option("-i,--input", input_file, "Arquivo de entrada")->required(); app.add_option("-o,--output", output_file, "Arquivo de saída"); app.add_option("-c,--compression", compression_level, "Nível de compressão (1-9)") ->check(CLI::Range(1, 9)); app.add_flag("-v,--verbose", verbose, "Saída detalhada");
CLI11_PARSE(app, argc, argv);
std::cout << "Arquivando: " << input_file << ""; std::cout << "Saída: " << output_file << ""; std::cout << "Nível: " << compression_level << ""; if (verbose) std::cout << "Modo de depuração ativado"; return 0;}Execução: ./archiver -i data.txt -o backup.zip -c 9 -v
Em caso de erro ou --help, o CLI11 exibirá automaticamente uma bela descrição.
2. cxxopts — leveza e simplicidade
cxxopts (GitHub: jarro2783/cxxopts) é outra biblioteca header-only. É mais simples que o CLI11, mas cobre 90% das necessidades: opções curtas/longas, valores padrão, listas e help. Ideal para utilitários pequenos.
Exemplo: leitura de configuração
#include <cxxopts.hpp>#include <iostream>
int main(int argc, char* argv[]) { cxxopts::Options options("greeter", "Programa de boas-vindas");
options.add_options() ("n,name", "Nome do usuário", cxxopts::value<std::string>()) ("a,age", "Idade", cxxopts::value<int>()->default_value("0")) ("v,verbose", "Saída detalhada", cxxopts::value<bool>()->default_value("false")) ("h,help", "Ajuda");
auto result = options.parse(argc, argv);
if (result.count("help")) { std::cout << options.help() << ""; return 0; }
std::string name = result["name"].as<std::string>(); int age = result["age"].as<int>(); bool verbose = result["verbose"].as<bool>();
std::cout << "Olá, " << name << "!"; if (verbose) std::cout << "Ida Também na biblioteca
Gerador de QR Codes em Kotlin: criação e configuração de QR Codes
league/csv para PHP: guia completo com exemplos