boost :: program_options错误或功能?

Dmi*_*riy 12 c++ boost boost-program-options

很简单的例子:



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

namespace po = boost::program_options;

int main(int argc, char* argv[])
{
    po::options_description recipients("Recipient(s)");
    recipients.add_options()
        ("csv",         po::value<std::string>(),     ""  )
        ("csv_name",    po::value<unsigned>(),        ""  )
    ;

    po::options_description cmdline_options;
    cmdline_options.add(recipients);

    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(cmdline_options).run(), vm);
    po::notify(vm);

    return 0;
}


还有一些测试:


>Test --csv test
in option 'csv_name': invalid option value

>Test --csv_name test
in option 'csv_name': invalid option value

>Test --csv_name 0

>Test --csv text
in option 'csv_name': invalid option value

>Test --csv 0

>Test --csv_name 0

>Test --csv_name 0 --csv text
multiple occurrences

看起来像boost :: program_option威胁参数"csv"为"csv_name".
它是一个功能还是错误?

Nik*_*sov 9

是的,由于默认选项解析风格,这是一个"功能" .尝试使用简短的选项,例如:

recipients.add_options()
    ("csv,c",      po::value<std::string>(), ""  )
    ("csv_name,C", po::value<unsigned>(),    ""  )
;
Run Code Online (Sandbox Code Playgroud)

或者玩这个basic_command_line_parser::style(int)方法.我没试过这个,所以YMMV.

  • 我是对的.parser.style(po :: command_line_style :: default_style ^ po :: command_line_style :: allow_guessing); 帮我.谢谢. (4认同)

Vla*_*rus 5

我担心这是一个错误.但是,它应该在1.42修复 - 你尝试过哪个版本?

  • 不,默认样式就可以。但是,如果您有两个选项,一个名为“csv”,另一个名为“csv_name”,并且命令行具有“--csv”,那么优先选择完全匹配而不是近似匹配是合理的。我相信解决方法是这样的:https://svn.boost.org/trac/boost/changeset/59744 (2认同)