问题 解析位置参数


考虑从boost程序选项中采用的以下简单程序 例子

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

#include <iostream>

int
main( int argc, char** argv )
{
    namespace po = boost::program_options;

    po::options_description desc("Options");

    unsigned foo;
    desc.add_options()
        ("help,h", "produce help message")
        ("foo", po::value(&foo), "set foo") 
        ;

    po::variables_map vm;
    try {
        po::store(
                po::parse_command_line( argc, argv, desc ),
                vm
                );
        po::notify( vm );

        if ( vm.count("help") ) {
            std::cout << desc << "\n";
            std::cout << "boost version: " << BOOST_LIB_VERSION << std::endl;
        }
    } catch ( const boost::program_options::error& e ) {
        std::cerr << e.what() << std::endl;
    }
}

以下行为是预期的:

samm$ ./a.out -h
Options:
  -h [ --help ]         produce help message
  --foo arg             set foo

boost version: 1_44
samm$ ./a.out --help
Options:
  -h [ --help ]         produce help message
  --foo arg             set foo

boost version: 1_44
samm$ ./a.out --foo 1
samm$ ./a.out --asdf
unknown option asdf
samm$

但是,在引入位置参数时我感到很惊讶,它没有被标记为错误

samm$ ./a.out foo bar baz
samm$

为什么是 boost::program_options::too_many_positional_options_error 异常没有抛出?


12542
2017-10-04 18:59


起源

我的猜测是除非有领先优势 - 要么 --事情被认为是争论,而不是选择。 - Arun
@Arun,文档中没有明确说明该行为。我在下面的答案中找到了一个解决方案,尽管这对我来说仍然是违反直觉的。 - Sam Miller


答案:


当我明确指出不支持位置选项时:

    const po::positional_options_description p; // note empty positional options
    po::store(
            po::command_line_parser( argc, argv).
                      options( desc ).
                      positional( p ).
                      run(),
                      vm
                      );

我得到了预期的行为:

samm$ ./a.out asdf foo bar
too many positional options
samm$

14
2017-10-04 21:47



我自己得出了同样的结论。你必须明确说明你似乎有点奇怪 别 想要位置参数。假设没有明确要求的任何东西是不需要的,这将更有意义。 - cdyson37