似乎boost::program_options默认情况下不识别位置参数。这意味着像这样的非选项参数opt2=option_value_2
将被忽略。但是,文档并不清楚。您可以使用 启用对位置参数的处理basic_command_line_parser::positional()
。
举例
try {
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).
options(desc).positional({}).run(),
vm);
po::notify(vm);
} catch (po::too_many_positional_options_error &e) {
// A positional argument like `opt2=option_value_2` was given
cerr << e.what() << endl;
exit(1);
} catch (po::error_with_option_name &e) {
// Another usage error occurred
cerr << e.what() << endl;
exit(1);
}
解释
基本上,
po::store(po::parse_command_line(argc, argv, desc), vm);
已被替换为
po::store(po::command_line_parser(argc, argv)
.options(desc).positional({}).run(),
vm);
据我了解文档,parse_command_line(argc, argv, desc)
是command_line_parser(argc, argv).options(desc).run()
. 通过添加对 的调用positional()
,我们可以处理位置参数。通过指定{}
,不允许位置参数。too_many_positional_options_error
当给出太多位置参数时,会抛出一个实例。