c++ - Boost::Program_options,传递未知的命令行参数

标签 c++ boost boost-program-options

我正在使用 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);
}

code example

结果:

./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/

相关文章:

c++ - 如何压缩无符号字符的 C++ vector 以进行快速比较?无需减压

c++ - 如何创建一个系统来存储和加载数据库中的任何结构?

c++ - boost::algorithm::contains std::vector<long> & long 值

c++ - 如果存在 boost 则有条件编译

c++ - 使用 CUDA nvcc 编译时与 boost 库的链接失败,使用 gcc 成功

c++ - 为什么 boost::any 在 boost::program_options 中表现出未定义的行为?

c++ - 图像格式和无符号字符数组

c++ - boost 正则表达式混淆

c++ - 使用 boost::program_options 时,如何设置参数的名称?

C++ 对结构和类的按位运算