2010-10-04 25 views
11

Considere el siguiente programa trivial adoptado de las opciones del programa de impulso examplesanálisis sintáctico argumentos posicionales

#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; 
    } 
} 

el siguiente comportamiento es el esperado:

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$ 

Sin embargo, me sorprendió al introducir un argumento posicional, no fue marcado como un error

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

Por qué ¿No se lanza la excepción boost::program_options::too_many_positional_options_error?

+0

Mi conjetura es que si no hay un '' -' o --' , las cosas se consideran como argumentos, no como opciones. – Arun

+0

@Arun, ese comportamiento no está explícitamente claro en la documentación. De alguna manera, he encontrado una solución en mi respuesta, aunque todavía me parece que no es intuitiva. –

Respuesta

14

cuando no hay opciones indicar explícitamente posicionales son compatibles:

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

consigo el comportamiento esperado:

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

Acabo de llegar a la misma conclusión yo mismo. Parece un poco extraño que tengas que declarar explícitamente que no quieres argumentos posicionales. Tendría más sentido suponer que no se quiere nada que no se solicite explícitamente. – cdyson37

Cuestiones relacionadas