c – 解析位置参数

考虑从boost程序选项 examples中采用的以下琐碎程序
#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异常不会抛出?

解决方法

当我明确指出不支持位置选项:
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$

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...