Boost program_options:允许从环境中取消声明

时间:2018-11-13 16:20:51

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

我有一个应用程序,可以分两个步骤加载选项。在第二步中,options_description对象中可能未声明某些选项(取决于第一步中传递的选项)。

似乎没有选择忽略未声明的选项,类似于解析command line argumentsconfiguration 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

1 个答案:

答案 0 :(得分:0)

恕我直言,这将是对boost库的一个不错的添加,使其与命令行和配置文件解析器相当。

以下内容改编自my gist


使用Boost的program_options加载环境变量时,无法告诉boost忽略options_description对象中未指定的变量。

此代码段显示如何获得与命令行和配置文件解析器可用的allow_unregistered()选项类似的行为。

例如,如果您尝试通过指定名为MYAPP_ONE的选项并在one中使用前缀MYAPP来读取parse_environment,它将很好用。

如果MYAPP_X对象中未包含另一个options_description,则会出现问题。然后将引发异常。

如果使用程序参数(argcargv)或配置文件,则库中有一个选项可以简单地忽略{{1}中未声明的选项}。

对于环境变量,情况并非如此。该代码段将仅读取您声明的选项,而忽略其他可能已声明的选项。

因此,其行为类似于options_description功能。

allow_unregistered()