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?
Meine Vermutung ist, dass es sei denn, es ist ein führender '-' oder' --' Dinge werden als Argumente und nicht als Optionen betrachtet. – Arun
@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. –