gpt4 book ai didi

c++ - boost 程序选项中的默认和隐式参数

转载 作者:行者123 更新时间:2023-11-28 05:31:43 25 4
gpt4 key购买 nike

我发现 boost program_options 有一些奇怪的行为。我有一个选项有 default and implicit value .为了制作我的程序的广泛兼容的二进制文件,我在 Holy Build Box 下编译它,这似乎运作良好。但是,我遇到的问题是,当我为这个预编译的可执行文件提供此选项的显式参数(即 --writeMappings ./somefile.txt)时,结果解析不正确。 boost::program_options 不是将参数 ./somefile.txt 映射到选项 --writeMappings,而是认为 --writeMappings 的参数> 选项为空,还有另一个选项,空字符串 "",其参数为 ./somefile.txt

我将变量映射存储在一个 JSON 文件中,示例 here准确地展示了我所看到的行为。有谁知道为什么会发生这种情况?我认为这不是正确的行为。奇怪的是,当我在 Holy Build Box 的外部编译相同的代码(使用 g++-4.9.1 而不是 g++-4.8.2)时,程序按预期工作,隐式参数被任何覆盖传递的显式参数。

这是一个重现问题的最小示例:

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


int main(int argc, char* argv[]) {
using std::cerr;
using std::string;
namespace po = boost::program_options;
string fname;
po::options_description generic("\n"
"basic options");
generic.add_options()("version,v", "print version string")
(
"writeMappings", po::value<string>(&fname)->default_value("")->implicit_value("-"),
"If this option is provided, then the quasi-mapping results will be written out in SAM-compatible "
"format. By default, output will be directed to stdout, but an alternative file name can be "
"provided instead.");
po::options_description visible("options");
visible.add(generic);


po::variables_map vm;
try {
auto orderedOptions =
po::command_line_parser(argc, argv).options(visible).run();

po::store(orderedOptions, vm);
po::notify(vm);
std::cerr << "writeMappings = " << fname << '\n';
} catch (po::error& e) {
std::cerr << "Exception : [" << e.what() << "]. Exiting.\n";
std::exit(1);
}
return 0;
}

我编译了以下内容:

g++ -std=c++11 -o opttest main.cpp -L /home/boost_1_61_0/lib -I /home/boost_1_61_0/include -lboost_program_options

我通过相应的调用获得了以下输出:

  $ ./opttest
writeMappings =
$ ./opttest --writeMappings
writeMappings = -
$ ./opttest --writeMappings stuff
writeMappings = -

最后的调用是有问题的。鉴于显式选项,我希望 writeMappings = stuff。但是,我会注意到,当我使用替代语法时,它会被正确解析:

  $ ./opttest --writeMappings=stuff
writeMappings = stuff

但是,我真的很希望它能与更常见的 --option argument 语法一起使用。

最佳答案

来自docs ,强调我的:

typed_value * implicit_value(const T & v);

Specifies an implicit value, which will be used if the option is given, but without an adjacent value. Using this implies that an explicit value is optional, but if given, must be strictly adjacent to the option, i.e.: '-ovalue' or '--option=value'. Giving '-o' or '--option' will cause the implicit value to be applied.

所以当你写的时候:

$ ./opttest --writeMappings stuff

stuff 与选项 writeMappings 并不严格相邻,因此完全被解释为一个单独的选项。你必须写:

$ ./opttest --writeMappings=stuff

获取 "stuff" 的值而不是 "-"

关于c++ - boost 程序选项中的默认和隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39351580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com