boost :: program_options - 它是否为命令行选项进行了精确的字符串匹配?

时间:2010-11-16 18:11:34

标签: c++ windows boost command-line-arguments boost-program-options

boost :: program_options的options_description匹配方式似乎存在问题。

int main(int argc, char* argv[])
{
    boost::program_options::options_description desc("CmdLine utility");
    desc.add_options()
        ("hel", "hel message")
        ("help", "produce help message")
        ("helps","helps message")       
    ;
    boost::program_options::variables_map vm;
    boost::program_options::store(boost::program_options::parse_command_line(argc, argv,desc), vm);
    boost::program_options::notify(vm);

    if(vm.count("help")) {
        std::cout << desc << std::endl;
    }
    if(vm.count("helps")) {
        std::cout << "helps..." << std::endl;
    }
    if(vm.count("hel")) {
        std::cout << "hel..." << std::endl;
    }
    return 0;
}

输出 -

C:\code>cmd.exe --helps
helps...
C:\code>cmd.exe --help
helps...
C:\code>cmd.exe --hel
helps...

如果我更改使用add_options()调用添加选项的顺序,则输出会更改。此外,看起来program_options不执行完整的命令字符串匹配,因此即使您输入选项的子字符串,它也会将其视为有效选项而不进行完整的字符串比较。如果这是一个boost :: program_options功能,有没有办法强制它进行精确的字符串匹配而不是使用子字符串匹配? (我正在使用Boost版本1.42)

2 个答案:

答案 0 :(得分:3)

默认情况下,program_option的allow_guessing样式位为on,因此子字符串匹配就足够了。您观察到的行为,即选项与命令行的前缀匹配,即使存在完全匹配的其他选项,也是一个错误。它固定在1.45。

答案 1 :(得分:0)

也许你错了。你的例子很好。看看我得到的输出:

[vladimir@asa example]$ ./a.out --help
CmdLine utility:
  --hel                 hel message
  --help                produce help message
  --helps               helps message

[vladimir@asa example]$ ./a.out --hel
hel...
[vladimir@asa example]$ ./a.out --helps
helps...