Освоение параметров командной строки в C++: разгадка секретов синтаксического анализа

При разработке приложений на C++ обычно предоставляются параметры командной строки для повышения гибкости и функциональности программы. В этой статье блога мы рассмотрим различные методы извлечения и обработки параметров, передаваемых из командной строки. Итак, возьмите свой любимый напиток, расслабьтесь и давайте окунемся в мир анализа параметров командной строки в C++!

  1. Традиционный подход с использованием argc и argv:
    Самый простой и основной метод обработки параметров командной строки в C++ — использование argcи argvпараметры функции main(). Эти параметры предоставляют количество аргументов командной строки и массив строк в стиле C соответственно. Вы можете перебирать массив и вручную обрабатывать параметры в соответствии с вашими требованиями. Однако этот подход может стать громоздким по мере увеличения количества вариантов.
int main(int argc, char* argv[]) {
    for (int i = 1; i < argc; ++i) {
        if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
            // Display help message
        } else if (strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "--output") == 0) {
            // Process output option
            if (i + 1 < argc) {
                std::string outputFilename = argv[i + 1];
                // Process outputFilename
                ++i;
            } else {
                // Handle missing argument for output option
            }
        } else {
            // Handle unrecognized option
        }
    }
// Rest of the program
    return 0;
}
  1. Использование getopt:
    Функция getopt— это широко используемая библиотечная функция для анализа параметров командной строки. Он обеспечивает удобный способ обработки как коротких, так и длинных параметров с автоматической обработкой аргументов. Хотя это библиотека C, ее можно использовать в программах на C++.
#include <unistd.h>
int main(int argc, char* argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "ho:")) != -1) {
        switch (opt) {
            case 'h':
                // Display help message
                break;
            case 'o':
                // Process output option
                std::string outputFilename = optarg;
                // Process outputFilename
                break;
            case '?':
                // Handle unrecognized option
                break;
        }
    }
// Rest of the program
    return 0;
}
  1. Boost.Program_options:
    Boost.Program_options — это мощная библиотека, предоставляющая комплексную и гибкую структуру для обработки параметров командной строки. Он поддерживает широкий спектр типов параметров, включая позиционные параметры, множественное вхождение, значения по умолчанию и многое другое.
#include <boost/program_options.hpp>
int main(int argc, char* argv[]) {
    namespace po = boost::program_options;
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help,h", "Display help message")
        ("output,o", po::value<std::string>(), "Output filename");
    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm);
    if (vm.count("help")) {
        // Display help message
    }
    if (vm.count("output")) {
        std::string outputFilename = vm["output"].as<std::string>();
        // Process outputFilename
    }
// Rest of the program
    return 0;
}
  1. argparse:
    argparse — это библиотека C++, предназначенная только для заголовков, созданная на основе argparse Python. Он предоставляет интуитивно понятный и гибкий интерфейс для анализа параметров командной строки, обработки подкоманд и создания сообщений об использовании.
#include <argparse/argparse.hpp>
int main(int argc, char* argv[]) {
    argparse::ArgumentParser parser("MyProgram");
    parser.add_argument("-o", "--output")
        .help("Output filename")
        .action([](const std::string& value) {
            // Process output option
        });
    parser.parse_args(argc, argv);
    // Rest of the program
    return 0;
}
  1. CLI11:
    CLI11 — это современная, многофункциональная и простая в использовании библиотека анализатора командной строки для C++. Он поддерживает широкий спектр типов параметров, подкоманд, автоматическое создание справки и многое другое.