2015-10-26 14 views
8

私はブースト1.58.0でコマンドラインを解析しようとしています。私のコードは非常にシンプルで、チュートリアルからコピー&ペーストされています。それは以下のようになります。ブースト:位置指定引数のための認識できないオプション

try { 
     po::options_description desc; 
     desc.add_options() 
       ("version,v", "Display version of application."); 

     po::positional_options_description p; 
     p.add("input-file", -1); 

     try 
     { 
      po::store(po::command_line_parser(argc, argv). 
         options(desc).positional(p).run(), vm); 

      if (vm.count("version") ) 
      { 
       std::cout << "Program version: " << SHUF_T_VERSION << std::endl << "Boost library version: " << BOOST_LIB_VERSION << std::endl; 
       return false; 
      } 

      po::notify(vm); // throws on error, so do after help in case 
      // there are any problems 
     } 
     catch(po::error& e) 
     { 
      std::cerr << "ERROR: " << e.what() << std::endl << std::endl; 
      std::cerr << desc << std::endl; 
      return false; 
     } 

    } 
    catch(std::exception& e) 
    { 
     std::cerr << "Unhandled Exception: " 
        << e.what() << ", application will now exit" << std::endl; 
     return false; 

    } 

    return true; 

全体のコードはhereです。 コードが正しいようです。 app -vが正しく処理されています。しかし、もし私がどんな位置的な議論を含んでいても、app myfileのようにpo::store()unrecognised option 'myfile'を投げる。なぜこれがうまくいくのかについてのアイデアはありますか?あなたはオプションとして「入力ファイル」を追加する必要が

答えて

9

po::options_description desc; 
desc.add_options() 
     ("version,v", "Display version of application.") 
     ("input-file", po::value<std::vector<std::string> >(), "input file"); 

the tutorialから:

「入力ファイル」オプションは、処理するファイルのリストを指定します。

compiler a.cpp

私たちは一瞬でこれに対処しますと比べて、

compiler --input-file=a.cpp

は少し非標準である:それはのようなものを書いて、当然のことながら、スタートのために大丈夫だ、しかし。

上記のようにオプション名を持たないコマンドライントークンは、このライブラリによって「位置オプション」と呼ばれます。彼らも処理することができます。ユーザの助けを借りて、ライブラリは "a.cpp"が実際に "--input-file = a.cpp"と同じ意味を持つと判断することができます。必要な追加コードは次のとおりです。

po::positional_options_description p; 
p.add("input-file", -1); 

po::variables_map vm; 
po::store(po::command_line_parser(ac, av). 
      options(desc).positional(p).run(), vm); 
po::notify(vm); 
関連する問題