تحليل الحجج الموضعية
-
27-09-2019 - |
سؤال
النظر في البرنامج التافهة التالي المعتمد من خيارات برنامج التعزيز أمثلة
#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$
لا تنتمي إلى StackOverflow