2017-06-29 5 views
-3

私は現在、通常のオプションgetoptを取得する必要があるC++プロジェクトに取り組んでいますが、動詞ベース(systemctlはサブコマンドを使った良い例です)です。どうすればいい? (注:それができる場合、これは最小限のアプリケーションは、それが最善だろうネイティブLLVM C/C++の代わりにライブラリの使用)動詞ベースのargvをC++で解析する

+0

チェックを[ '後押し:: program_options'](http://www.boost.org /doc/libs/1_64_0/doc/html/program_options.html) –

+0

@πάνταῥεῖこれはオプションではありません。最小限のアプリケーションなので、できるだけ外部の図書館を避けたいのです。 – FireFaced

+3

_ "...最小限のアプリケーションであるから..." _あなたが自分のものをすべて実装しようとすれば、それはすぐに1にならないかもしれません。 –

答えて

1

手動std::strcmp()を使用してオプションを解析することができますすることができます

int main(int, char** argv) 
{ 
    try 
    { 
     enum class verb_type {none, start, stop, restart, status}; 

     verb_type verb = verb_type::none; 
     std::string service; 

     for(auto arg = argv + 1; *arg; ++arg) 
     { 
      if(verb == verb_type::none) 
      { 
       if(!std::strcmp(*arg, "--help")) 
       { 
        print_help(); 
        return EXIT_SUCCESS; 
       } 
       else if(!std::strcmp(*arg, "start")) 
        verb = verb_type::start; 
       else if(!std::strcmp(*arg, "stop")) 
        verb = verb_type::stop; 
       else if(!std::strcmp(*arg, "restart")) 
        verb = verb_type::restart; 
       else 
        throw std::runtime_error("unknown operation: " << std::string(*arg)); 
      } 
      else // get noun 
      { 
       service = *arg; 
       if(!is_service(service)) 
        throw std::runtime_error("Unrecognized service: " + service); 
      } 
     } 

     // use verb & service here.... 
    } 
    catch(std::exception const& e) 
    { 
     std::cerr << e.what() << '\n'; 
     return EXIT_FAILURE; 
    } 
    catch(...) 
    { 
     std::cerr << "Unknown exception." << '\n'; 
     return EXIT_FAILURE; 
    } 

    return EXIT_SUCCESS; 
} 

をあなたが好き、あなたは非getoptの引数が開始された教えてoptindを使用する場合も、手を前に、通常のgetoptオプション処理を実行します。

 // start where getopt ends 
     for(auto arg = argv + optind; *arg; ++arg) 
     { 
      // ... etc ... 
+0

オプションがどこで終了するかを理解する方法を教えてくれてありがとう。それは私の問題をかなり解決します。 – FireFaced

関連する問題