为什么boost :: program_options :: bool_switch的行为不像我期望的那样?

时间:2017-01-20 01:24:43

标签: c++ c++11 boost boost-program-options

以下代码使用po::bool_switch(&flag),希望自动为flag分配正确的值。

我的编译命令是clang++ -std=c++11 test.cpp -o test -lboost_program_options

所以我用./test -h运行程序,但没有显示帮助信息。

为什么会这样?

#include <iostream>
#include <boost/program_options.hpp>

namespace
{
  namespace po = boost::program_options;
}

int main(int ac, char ** av)
{
  bool flag;

  po::options_description help("Help options");

  help.add_options()
    ( "help,h"
    , po::bool_switch(&flag)->default_value(false)
    , "produce this help message" );

  po::variables_map vm;

  po::parsed_options parsed
    = po::parse_command_line(ac,av,help);

  po::store(po::parse_command_line(ac,av,help),vm);

  if (flag)
  {
    std::cout << help;
  }
  po::notify(vm);

  return 0;
}

1 个答案:

答案 0 :(得分:1)

解析并存储参数后,您应该调用notifystore只填写variables_map的内部数据结构。 notify发布它们。

您的示例几乎与&#34; 入门部分&#34;在tutorial

here他们给出了一个非常大胆的警告,不要忘记它:

  

最后,对notify函数的调用运行用户指定的notify函数,并在需要时将值存储到常规变量中。

     

警告:   在您存储了所有已解析的值之后,不要忘记调用通知功能。

这应该有效:

po::variables_map vm;
po::parsed_options parsed
  = po::parse_command_line(ac,av,help);
po::store(po::parse_command_line(ac,av,help),vm);
po::notify(vm); // call after last store, and before accesing parsed variables

if (flag)
{
  std::cout << help;
}