2010-10-04 4 views
11

Betrachten Sie das folgende triviale Programm aus dem Programm Boost angenommen Optionen examplesParsing Positionsargumente

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

das folgende Verhalten wie erwartet:

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$ 

aber ich war überrascht, als eine Positions Argument Einführung es wurde nicht als Fehler markiert

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

Warum ist boost::program_options::too_many_positional_options_error Ausnahme nicht geworfen?

+0

Meine Vermutung ist, dass es sei denn, es ist ein führender '-' oder' --' Dinge werden als Argumente und nicht als Optionen betrachtet. – Arun

+0

@Arun, dieses Verhalten ist nicht explizit in der Dokumentation klar. Ich habe in meiner Antwort unten eine Lösung gefunden, obwohl sie mir immer noch widersinnig scheint. –

Antwort

14

wenn ich explizit angeben, keine Positionsmöglichkeiten werden unterstützt:

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

ich das erwartete Verhalten erhalten:

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

Bin gerade selbst zum selben Schluss gekommen. Es scheint ein bisschen komisch, dass Sie explizit angeben müssen, dass Sie Positionsargumente nicht wollen. Es wäre sinnvoller anzunehmen, dass alles, was nicht ausdrücklich verlangt wird, nicht erwünscht ist. – cdyson37