为什么boost::p rogram_options接受切碎的单词

Why is boost::program_options accepting chopped words?

本文关键字:单词 options boost rogram 为什么      更新时间:2023-10-16

我有以下程序:

#include <boost/program_options.hpp>
bool check_options(int argc, char** argv)
{
    using namespace boost::program_options;
    variables_map vm;
    // Command line options
    std::string cfg_file_name;
    options_description cmd_line("Allowed options");
    cmd_line.add_options()
        ("help", "produce this help message")
        ;
    store(parse_command_line(argc, argv, cmd_line), vm);
    notify(vm);    
    if(vm.count("help")) 
    {
        std::cout << cmd_line << std::endl;
        return false;
    }
    return true;
}
int main(int argc, char** argv)
{
    if(!check_options(argc, argv))
        return 1;
    return 0;
}

当我用./myprg --help运行它时,我得到了我期望的结果:

Allowed options:
  --help                produce this help message

但是,即使我运行,我也得到相同的结果:./myprg --h./myprg --he./myprg --hel。最后这些选项不应该抛出错误吗?

似乎接受部分匹配是boost::optiondefault_style

根据Boost网站的回答 http://lists.boost.org/boost-users/2007/02/25861.php

可以通过向 parse_command_line 传递一个额外的参数来更改此默认值以要求完全匹配。

由OP编辑:实际上,我不得不使用更通用的command_line_parser而不是parse_command_line(允许更改样式),从而将store(...行替换为以下行:

store(command_line_parser(argc, argv).options(cmd_line).style(command_line_style::default_style & ~command_line_style::allow_guessing).run(), vm);