2012-11-11 37 views
1

这是为什么崩溃时,我使用这个命令行:“节目-p 1”,而不是升压编程选项崩溃我的应用程序

我用VS 2008编译它,使用升压1.51“--P 1计划”。

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; 
+5

已确定它在调试器中坠毁的位置? – Caribou

回答

2

OK,它崩溃与联合国处理的异常:

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处理无法识别的程序选项,或者您可能有进一步的崩溃。

+0

@LaurentiuNiculae np :) – Caribou

+0

另外我的期望是“p”选项默认处理,没有崩溃,在这两种形式(“ - p”和“-p”),因为它是相同的选项(我没有为长选项指定不同的名称)。但我的期望可能是错误的:) – Figures

3

加速编程'选项采用--作为默认选项起始字符序列。如果你想有“单字母”选择始发于一个-字符的支持,你需要指定

desc.add_options()("p,p", value<std::string>(), "pi") 

我猜程序崩溃时你正在展示的代码行之后发生的地方。您应该调试(或使用更多的cout语句)以更准确地确定崩溃点。

+0

:)打败我吧 – Caribou

+0

@Caribou De nada! Upvote如果你喜欢... –