## Основные сценарии использования библиотеки program_options ### Начало работы В этом разделе мы рассмотрим простейший пример использования библиотеки. Предполагается, что действует следующий алиас пространства имён: ```cpp namespace po = boost::program_options; ``` #### Пример базового использования Простейший пример, обрабатывающий два параметра: ```cpp // Объявление поддерживаемых параметров po::options_description desc("Допустимые параметры"); desc.add_options() ("help", "показать справочную информацию") ("compression", po::value(), "установить уровень сжатия"); 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() << ".\n"; } else { cout << "Уровень сжатия не установлен.\n"; } ``` ### Детали работы с параметрами #### Типы и свойства параметров Рассмотрим более сложный пример на основе компилятора: ```cpp int opt; po::options_description desc("Допустимые параметры"); desc.add_options() ("help", "показать справочную информацию") ("optimization", po::value(&opt)->default_value(10), "уровень оптимизации") ("include-path,I", po::value>(), "путь включения") ("input-file", po::value>(), "входной файл"); ``` Особенности этого примера: * Параметр `optimization` имеет значение по умолчанию 10 * Параметр `include-path` поддерживает короткое имя `-I` * Векторные типы позволяют указывать параметр несколько раз #### Позиционные параметры ```cpp 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); ``` ### Использование нескольких источников #### Группировка параметров ```cpp // Общие параметры командной строки po::options_description generic("Общие параметры"); generic.add_options() ("version,v", "показать версию") ("help", "показать справку"); // Параметры конфигурации po::options_description config("Конфигурация"); config.add_options() ("optimization", po::value(&opt)->default_value(10), "уровень оптимизации") ("include-path,I", po::value>()->composing(), "путь включения"); // Скрытые параметры po::options_description hidden("Скрытые параметры"); hidden.add_options() ("input-file", po::value>(), "входной файл"); ``` Пример использования: ```bash $ 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 ``` В этом примере значения из конфигурационного файла и командной строки корректно объединяются, при этом значения из командной строки имеют приоритет.