11

コマンドラインオプション、設定、設定ファイルを扱うためにどのパッケージを使用しますか?コマンドラインオプションと設定ファイルをどのように扱いますか?

私はユーザ定義オプションを、コマンドラインから、および/または設定ファイルから読み取るものを探しています。

オプション(設定)は、コード内のさまざまなオブジェクトに異なる(サブセットの)オプションを渡すことができるように、異なるグループに分割可能である必要があります。

私はboost::program_optionsを知っていますが、私はかなりAPIに慣れることができません。軽量の代替品はありますか?

(ところで、あなたは今までにグローバルオプションを使用しない、どこからでも読むことができ、あなたのコード内のオブジェクト?それとも、その悪を考えるでしょうか?)

答えて

5

さて、あなたは、私の答えが気に入らない。私はboost::program_optionsを使用します。インターフェースは使い慣れていますが、いったんダウンしてしまえば驚くほどです。あなたが構文が間違っている場合は、に実行時エラーが発生するので、単体テストのボートロードを実行するようにしてください。

そして、私はそれらをシングルトンオブジェクト(読み取り専用)に保存します。私はそれが悪いとは思わない。シングルトンが受け入れられる場所について私が考えることができるいくつかのケースの1つです。

+1

+1 boost :: program_optionsに+1します。私はシングルトンとしてプログラムオプションを使用することに注意します。私たちはこれを行うことで、ファイルごとに異なるオプションセットを追加する必要があるという点で噛まれました。最初に戻ってシングルトンを削除して、個々のファイルごとに異なるオプションセットを保存する必要があります。 –

+0

良い点、リチャード。私は、ゲームのためにboost :: program_optionsを使用しています。明らかに、1セットのオプションはプロセスごとに十分ですが、異なる目的のためにこれは悪い考えです。 – rlbond

+0

あなたはまだboost :: program_optionsに賛成ですか?それはもはや開発されていないように見えます(ドキュメントウェブサイトは2004年に最後に修正されました)。それはC++ 11と互換性がありますか?あなたのポストの行間を読むときは、実際にはお勧めできません。*単体テストのボートロードを実行してください。構文が間違っていると、ランタイムエラーが発生します。*大きな赤旗です! – Walter

-4

Apache Antを試してみてください。その主な使い方はJavaプロジェクトですが、Javaについては何もなく、ほとんど何でも使えます。

使い方はかなり簡単で、コミュニティサポートもたくさんあります。あなたが求めているようなことをするのは本当に良いことです。

コードのグローバルオプションについては、それらは非常に必要で有用だと思います。しかし、それらを悪用しないでください。

+3

Uhh、Apache Ant?ビルドツール? C++でコマンドラインオプションを読むこととは何が関係していますか? – Frank

+0

C++の基本設定ファイルを保持することはできますが、すべての実際の作業はAntで行うことができます。 http://www.codemesh.com/products/junction/doc/ant_cpp.htmlまたはhttp://www.google.com/search?hl=en&site=&q=using+ant+c%2B%2B&btnG=検索 –

0

コマンドライン引数の解析についてはわかりません。私はその分野で非常に豊富な機能を必要とせず、私のソフトウェアに依存性を増やすために自分自身を圧延しました。あなたのニーズに応じて、このルートを試してみるかしたくないかもしれません。私が書いたC++プログラムは、一般にコマンドラインからは呼び出されません。

一方、configファイルの場合は、XMLベースのフォーマットに勝てません。それは可読性があり、拡張性があり、構造化されているなどです:)さらに、そこには多くのXMLパーサがあります。実際にはCライブラリですが、xmlsoft.orgのlibxml2を使う傾向があります。

+0

C++で書かれた高速XMLパーサーについては[pugixml.org](http://pugixml.org)をご覧ください。ボーナスとして、それは 'XPath'をサポートし、ヘッダーのみです! – Sean

3

ブーストがあなたにとって過剰な場合は、GNU Gengetoptもおそらくそれですが、IMHO、これは楽しいツールです。

そして、私はグローバルオプションオブジェクトから離れようとします、私は各クラスに独自の設定を読み込ませることを好みます。 「Globals are evil」の哲学に加えて、すべての設定を1か所で行うことができず、どこでどの設定変数が使用されているかを知ることは難しくなります。設定を使用している場所に近づけておくと、それぞれが何を目的としているのかが分かりやすくなり、きれいに保ちやすくなります。

(私が使用しているものに関しては、個人的に、すべてのために最近では、私の会社で他の誰かが書いたライブラリを解析する独自のコマンドラインをされているが、それは残念ながら、多くのお手伝いをしていません)

1

GNU getoptはかなりいいです。 C++の感覚を望むなら、ネイティブgetoptのラッパーであるgetoptppを考えてみてください。 設定ファイルに関しては、解析が容易であるように、できるだけ愚かにするようにしてください。あなたが少し慎重であれば、yaac & lexを使用したいかもしれませんが、それは小さなアプリにとっては本当に大きな金額になります。

また、アプリケーションで設定ファイルとコマンドラインオプションの両方をサポートすることをお勧めします。設定ファイルは、あまり頻繁に変更されないオプションに適しています。コマンドラインオプションは、即座に変更する引数を渡すときに便利です(通常は、他のプログラムによって呼び出されるアプリケーションを作成するときに便利です)。

11

Googleでは、gflagsを使用しています。設定ファイルは作成しませんが、フラグの場合はgetoptを使用するよりも苦労しません。

#include <gflags/gflags.h> 
DEFINE_string(server, "foo", "What server to connect to"); 
int main(int argc, char* argv[]) { 
    google::ParseCommandLineFlags(&argc, &argv, true); 
    if (!server.empty()) { 
     Connect(server); 
    } 
} 

DEFINE_fooは、フラグの値を知る必要があるファイルの先頭に置きます。他のファイルでも値を知る必要がある場合は、DECLARE_fooを使用します。テストのサポートも非常に優れているため、単体テストでは別々のフラグを設定できます。

+0

私が好き!非常に使いやすいように見えます。 – Milan

1

x86およびx64 WindowsでVisual Studio 2005を使用している場合、SimpleLibPlus libraryにはコマンドライン解析ユーティリティがいくつかあります。私はそれを使用して、それが非常に便利だとわかりました。

3

私は今、1年か2年のためにTCLAPを使用してきたが、ランダムに私はezOptionParserに出くわし。 ezOptionParserは、他のオプションパーサと同じように、「この複雑である必要はありません」 - シンドロームに悩まされません。

これまでのところ私はかなり感心しています。これは、特に設定ファイルをサポートしているためです。 TCLAPはより洗練されたライブラリですが、ezOptionParserのシンプルさと追加機能は非常に魅力的です。デバッグのために解析された入力の

  • プリティ印刷:同社のウェブサイトから

    その他の特典は、(0.2.0のように)含まれています。

  • 3つのレイアウト(整列、インターリーブ、または互い違い)での自動使用メッセージの作成。
  • 単一ヘッダファイルの実装。
  • STLのみに依存します。
  • 任意の短いオプション名と長いオプション名(ダッシュ ' - 'または '+'プレフィックスは不要です)。
  • 任意の引数リストの区切り文字。
  • 複数のフラグインスタンスが許可されています。
  • フラグ、データ型の範囲、ユーザー定義の範囲、リストのメンバーシップ、および文字列リストの大文字と小文字を区別する必要なオプションの検証。
  • 文字列または定数で定義できる検証基準。
  • コメントを含む複数のファイルのインポート。
  • ファイルにエクスポートすると、オプションを設定するか、または使用可能な場合はデフォルトを含むすべてのオプションを設定します。
  • オプションは、順序依存コンテキストの解析インデックスです。
+0

私はこれが非常に古いスレッドだと知っていますが、このスレッドを読んだ後、誰かが同じトラップに落ちないようにするためです。 ezOptionParserは実際にオプションを解析するのにはうまくいきますが、getUsage()関数を使ってコマンドラインオプションを報告すると、アプリケーションにクラッシュする致命的なバグがあります。ライブラリは著者によって今サポートされていないので、このバグは修正されません。極端な注意を払って使用してください。他のものを使用してください。 – Graham

関連する問題