C++ boost::program_options在指定意外的位置参数时不会报告错误
下面是一个使用boost解析选项的简单程序:C++ boost::program_options在指定意外的位置参数时不会报告错误,c++,boost,boost-program-options,C++,Boost,Boost Program Options,下面是一个使用boost解析选项的简单程序: #include <iostream> #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char **argv) { try { size_t param = std::numeric_limits<size_t>::max();
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char **argv)
{
try
{
size_t param = std::numeric_limits<size_t>::max();
po::options_description desc("Syntax: [options] \"input binary file\".\nAllowed options:");
desc.add_options()
("help,h", "produce help message")
("param,p", po::value<size_t>(¶m), "param");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::store(po::command_line_parser(argc, argv).options(desc).run(), vm);
po::notify(vm);
if (vm.count("help"))
{
std::cout << desc << "\n";
}
else
{
std::cout << "Running with param " << param << std::endl;
return 0;
}
}
catch(std::exception& e) {
std::cerr << "error: " << e.what() << "\n";
}
catch(...) {
std::cerr << "Exception of unknown type!\n";
}
return 1;
}
#包括
#包括
名称空间po=boost::program\u选项;
int main(int argc,字符**argv)
{
尝试
{
大小参数=标准::数值限制::最大值();
po::options\u description desc(“语法:[options]\“输入二进制文件\”\n所有选项:”);
说明添加选项()
(“帮助,h”,“生成帮助消息”)
(“参数,p”,po::value(¶m),“param”);
变量映射虚拟机;
po::store(po::parse_命令行(argc、argv、desc)、vm);
po::store(po::命令行解析器(argc,argv).options(desc.run(),vm);
po::通知(vm);
if(vm.count(“帮助”))
{
默认情况下接受std::cout位置。您可以检查是否未收到任何位置,也可以指定不允许任何位置:
po::positional_options_description positionals;
po::store(po::command_line_parser(args.size(), args.data())
.options(desc)
.positional(positionals)
.run(),
演示
#include <boost/program_options.hpp>
#include <iostream>
#include <iomanip>
namespace po = boost::program_options;
int main() {
std::vector<char const*> const cases[] = {
{ "hex2txt.exe" }, // outputs Running with param 0
{ "hex2txt.exe", "--param", "3" }, // outputs Running with param 3
{ "hex2txt.exe", "--toto" }, // outputs error: unrecognised option '--toto'
// All this is expected, however:
{ "hex2txt.exe", "foo" }, // outputs Running with param 0
};
for (auto args : cases) {
std::cout << "------";
for (auto arg : args)
std::cout << " " << std::quoted(arg);
std::cout << "\n";
try {
size_t param = 0; // std::numeric_limits<size_t>::max();
po::options_description desc(
"Syntax: [options] \"input binary file\".\nAllowed options:");
desc.add_options()("help,h", "produce help message")(
"param,p", po::value<size_t>(¶m), "param");
po::positional_options_description positionals;
po::variables_map vm;
po::store(po::command_line_parser(args.size(), args.data())
.options(desc)
.positional(positionals)
.run(),
vm);
po::notify(vm);
if (vm.count("help")) {
std::cout << desc << "\n";
} else {
std::cout << "Running with param " << param << std::endl;
//return 0;
}
} catch (std::exception const& e) {
std::cerr << "error: " << e.what() << "\n";
} catch (...) {
std::cerr << "Exception of unknown type!\n";
}
}
}
您的代码有两个相互竞争的命令行解析运行+存储。这是多余的,可能会产生令人惊讶的效果(我没有想到一个例子)。
------ "hex2txt.exe"
Running with param 0
------ "hex2txt.exe" "--param" "3"
Running with param 3
------ "hex2txt.exe" "--toto"
error: unrecognised option '--toto'
------ "hex2txt.exe" "foo"
error: too many positional options have been specified on the command line