【发布时间】:2019-04-16 12:52:53
【问题描述】:
我有一个分两步加载选项的应用程序。在第二步中,options_description 对象中可能未声明某些选项(取决于第一步中传递了哪些选项)。
似乎没有忽略未声明的选项,类似于用于解析 command line arguments 和 configuration files 的选项。
一个最小的工作示例:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main() {
int opt1;
po::options_description options("my app options");
options.add_options()
("opt1", po::value<int>(&opt1)->default_value(0), "option 1");
po::variables_map env;
po::store(po::parse_environment(options, "MYAPP_"), env);
po::notify(env);
printf("opt1: %d\n", opt1);
return 0;
}
默认情况下,您会得到一个零值,正如预期的那样:
$ ./a.out
opt1: 0
如果您设置MYAPP_OPT1,它也可以按预期工作
$ MYAPP_OPT1=123 ./a.out
opt1: 123
但是,如果你设置了一个没有在配置文件中指定的变量,它就会崩溃。
$ MYAPP_UNDEFINED=456 ./a.out
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> >'
what(): unrecognised option
Aborted (core dumped)
旁注
还有一件烦人的事情——如果我不声明"opt1",而是声明"OPT1",它甚至不会识别MYAPP_OPT1!
【问题讨论】:
标签: c++ boost boost-program-options