Files
boost_program_options_docs_ru/boost/1.89.0/tutorial.md

4.5 KiB
Raw Blame History

Основные сценарии использования библиотеки program_options

Начало работы

В этом разделе мы рассмотрим простейший пример использования библиотеки. Предполагается, что действует следующий алиас пространства имён:

namespace po = boost::program_options;

Пример базового использования

Простейший пример, обрабатывающий два параметра:

// Объявление поддерживаемых параметров
po::options_description desc("Допустимые параметры");
desc.add_options()
    ("help", "показать справочную информацию")
    ("compression", po::value<int>(), "установить уровень сжатия");

po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);

if (vm.count("help")) {
    cout << desc << "\n";
    return 1;
}

if (vm.count("compression")) {
    cout << "Уровень сжатия установлен на " 
         << vm["compression"].as<int>() << ".\n";
} else {
    cout << "Уровень сжатия не установлен.\n";
}

Детали работы с параметрами

Типы и свойства параметров

Рассмотрим более сложный пример на основе компилятора:

int opt;
po::options_description desc("Допустимые параметры");
desc.add_options()
    ("help", "показать справочную информацию")
    ("optimization", po::value<int>(&opt)->default_value(10), "уровень оптимизации")
    ("include-path,I", po::value<vector<string>>(), "путь включения")
    ("input-file", po::value<vector<string>>(), "входной файл");

Особенности этого примера:

  • Параметр optimization имеет значение по умолчанию 10
  • Параметр include-path поддерживает короткое имя -I
  • Векторные типы позволяют указывать параметр несколько раз

Позиционные параметры

po::positional_options_description p;
p.add("input-file", -1);

po::variables_map vm;
po::store(po::command_line_parser(ac, av)
          .options(desc).positional(p).run(), vm);
po::notify(vm);

Использование нескольких источников

Группировка параметров

// Общие параметры командной строки
po::options_description generic("Общие параметры");
generic.add_options()
    ("version,v", "показать версию")
    ("help", "показать справку");

// Параметры конфигурации
po::options_description config("Конфигурация");
config.add_options()
    ("optimization", po::value<int>(&opt)->default_value(10), "уровень оптимизации")
    ("include-path,I", po::value<vector<string>>()->composing(), "путь включения");

// Скрытые параметры
po::options_description hidden("Скрытые параметры");
hidden.add_options()
    ("input-file", po::value<vector<string>>(), "входной файл");

Пример использования:

$ bin/gcc/debug/multiple_sources
Пути включения: /opt
Уровень оптимизации: 1

$ bin/gcc/debug/multiple_sources --help
Допустимые параметры:

Общие параметры:
  -v [ --версия ]       : показать версию
  --help                : показать справку

Конфигурация:
  --оптимизация n       : уровень оптимизации
  -I [ --путь-включения ] путь : путь включения

$ bin/gcc/debug/multiple_sources --оптимизация=4 -I foo a.cpp b.cpp
Пути включения: foo /opt
Входные файлы: a.cpp b.cpp
Уровень оптимизации: 4

В этом примере значения из конфигурационного файла и командной строки корректно объединяются, при этом значения из командной строки имеют приоритет.