1

「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;
4

2 に答える 2

3

ブースト プログラム オプションは--、デフォルト オプションの開始文字シーケンスとして使用されます。1 文字で始まる「1 文字」オプションをサポートする場合-は、指定する必要があります。

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

プログラムのクラッシュは、表示しているコード行のどこかで発生すると思います。coutクラッシュのポイントをより正確に判断するには、デバッグ (またはさらにステートメントを使用) する必要があります。

于 2012-11-11T18:56:29.597 に答える
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を行う必要があります。そうしないと、さらにクラッシュする可能性があります。

于 2012-11-11T18:59:36.927 に答える