我正在使用 boost::program_options 来传递我的程序的配置文件。特别是我经常使用命令行覆盖某些选项。例如,如果我注册两个选项“opt1”和“opt2”,我可以通过运行我的程序来成功覆盖默认值
myProgram.exe --opt1=option_value_1 --opt2=option_value_2
一切都好,但是我已经发生过几次错误地运行我的程序
myProgram.exe --opt1=option_value_1 opt2=option_value_2
在这种情况下(缺少双连字符)不会引发错误。事实上,我显然可以将 myProgram 运行为
myProgram.exe list of any unregistered and unknown values
它仍然可以正确运行。我希望至少能得知发生了意外的事情。我的问题有解决办法吗?
最佳答案
您应该从解析命令中删除allow_unregistered()
。您的命令应该只是
po::store(parse_command_line(argc, argv, desc), vm);
然后未知选项将引发异常。
http://www.boost.org/doc/libs/1_54_0/doc/html/program_options/howto.html#idp123440592
如果你想要异常/错误,如果选项没有“--”,你应该编写额外的解析器,像这样的东西,可以帮助你
std::pair<std::string, std::string> fix_option(const std::string& value)
{
std::string name = value;
std::string val;
std::string::size_type pos = name.find("=");
if (pos != std::string::npos)
{
val = name.substr(pos + 1);
name = name.substr(0, pos);
}
if (name.substr(0, 2) != "--")
{
throw std::logic_error(std::string("invalid command, no -- in command: ") + name);
}
return std::make_pair(name.substr(2), val);
}
结果:
./new --help=j
output: j
./new help=j
output:
terminate called after throwing an instance of 'std::logic_error'
what(): invalid command, no -- in command: help
关于c++ - Boost::Program_options,传递未知的命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17742259/