当我使用此命令行时,为什么会崩溃:“program -p 1”而不是“program --p 1”
我用VS 2008编译它并使用了boost 1.51。
options_description desc("XXX");
desc.add_options()("p", value<std::string>(), "pi")
("s", value<std::string>(), "es");
std::cout << desc << std::endl;
variables_map vm;
store(parse_command_line(argc, argv, desc), vm);
notify(vm);
if (vm.count("p"))
cout << "p is: " << vm["p"].as<string>() << endl;
if (vm.count("s"))
cout << "s is: " << vm["s"].as<string>() << endl;
答案 0 :(得分:3)
Boost progam选项以--
为默认选项开始字符序列。如果您希望以支持单个-
字符开头的'单个字母'选项,则需要指定
desc.add_options()("p,p", value<std::string>(), "pi")
我想程序崩溃发生在您显示的代码行之后的某个地方。您应该调试(或使用更多cout
语句)来更准确地确定崩溃点。
答案 1 :(得分:2)
好吧,它崩溃了一个未处理的异常:
Unhandled exception at 0x76dbc41f in test.exe: Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> > at memory location 0x0018efd8..
它基本上不识别你的-p
因此阅读文档我发现它正在期待参数是长参数。这就是它需要并使用--p
。
这是修改后的来源(可编辑)
#include <boost/program_options.hpp>
#include <iostream>
#include <string>
int main(unsigned int argc, const char** argv)
{
boost::program_options::options_description desc("XXX");
desc.add_options()
("p-arg,p", boost::program_options::value<std::string>(), "pi")
("s", boost::program_options::value<std::string>(), "es");
std::cout << desc << std::endl;
boost::program_options::variables_map vm;
boost::program_options::store(
boost::program_options::parse_command_line(argc, argv, desc), vm);
boost::program_options::notify(vm);
if (vm.count("p-arg"))
std::cout << "p is: " << vm["p-arg"].as<std::string>() << std::endl;
if (vm.count("s"))
std::cout << "s is: " << vm["s"].as<std::string>() << std::endl;
}
您需要处理异常处理try-catch
以处理无法识别的程序选项,否则您可能会进一步崩溃。