2010-10-04 3 views
11

Рассмотрим следующую тривиальную программу, принятую из вариантов подталкивание программ 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$ 

Почему is boost::program_options::too_many_positional_options_error исключение не выбрасывается?

+0

Я полагаю, что, если не является ведущим '-' или' --' , вещи рассматриваются как аргументы, а не варианты. – Arun

+0

@Arun, это поведение явно не указано в документации. Я как-то нашел решение в своем ответе ниже, хотя это все еще кажется мне интригующим. –

ответ

14

, когда я явно указать не позиционные параметры не поддерживаются:

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$ 
+1

Сам пришел к такому же выводу. Кажется немного странным, что вы должны явно указать, что вы не хотите позиционных аргументов. Было бы разумнее предположить, что все, что явно не задано, не требуется. – cdyson37

Смежные вопросы