我使用boost.program_options库。考虑这个简化的案例。
po::options_description desc("Usage");
desc.add_options()
("uninstall,u", "uninstall program")
("custom,c", po::wvalue<std::wstring>(), "specify custom action");
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
我想在这样的命令行上产生错误:
testprog.exe -u c- action1
注意,用户输了一个拼写错误“c-”而不是“-c”。但解析器将此理解为单个-u选项。我该如何处理这类案件?
答案 0 :(得分:4)
我想在这样的命令行上产生错误:
testprog.exe -u c- action1
注意,用户输了一个拼写错误“c-”而不是“-c”。但解析器 将此理解为单个-u选项。我该如何处理这类案件?
指示program_options
库不接受位置参数,并获得所需的行为
代码&amp;编译:
macmini:stackoverflow samm$ cat po.cc
#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("Usage");
desc.add_options()
("uninstall,u", "uninstall program")
("custom,c", po::wvalue<std::wstring>(), "specify custom action")
;
po::variables_map vm;
po::command_line_parser cmd_line( argc, argv );
cmd_line.options( desc );
cmd_line.positional( po::positional_options_description() );
try {
po::store( cmd_line.run(), vm );
po::notify(vm);
} catch ( const std::exception& e ) {
std::cerr << e.what() << std::endl;
return -1;
}
return 0;
}
macmini:stackoverflow samm$ g++ po.cc -I /opt/local/include -L/opt/local/lib -lboost_program_options -Wl,-rpath,/opt/local/lib
运行:
macmini:stackoverflow samm$ ./a.out -u c- action1
too many positional options
macmini:stackoverflow samm$ ./a.out -u -c action1
macmini:stackoverflow samm$
答案 1 :(得分:2)
将argc-1
与program_options
找到的参数数量进行比较?如果不匹配,则存在语法错误。
它不会捕获所有案例,但它可能会抓住那些重要的案件。
答案 2 :(得分:0)
我认为你能做到这一点的唯一方法是确保你需要的每个参数都存在,例如通过测试每种类型的计数。
if (vm.count("uninstall")) { ... }
if (vm.count("custom")) { ... }
如果您需要的选项不存在(即计数为0)或存在(例如-u
并且-c
无法指定,则可以生成错误,两者的计数均为{{ 1}})。