13

コマンドラインオプション、設定、および構成ファイルを処理するためにどのパッケージを使用しますか?

コマンドラインや設定ファイルからユーザー定義のオプションを読み取るものを探しています。

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

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

(ところで、どこからでも読み取ることができるグローバルオプションオブジェクトをコードで使用したことはありますか?それとも、それを悪と見なしますか?)

4

9 に答える 9

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します。テストのサポートも充実しているため、単体テストでさまざまなフラグを個別に設定できます。

于 2009-06-13T07:49:21.690 に答える
6

コマンド ラインと C++ については、私は TCLAP: テンプレート化されたコマンド ライン引数パーサーのファンです。

http://sourceforge.net/projects/tclap/

于 2009-06-15T01:49:07.967 に答える
5

さて、あなたは私の答えを気に入らないでしょう。私は使用しますboost::program_options。インターフェースは慣れるまでに時間がかかりますが、慣れると素晴らしいです。構文を間違えると実行時エラーが発生するため、単体テストを大量に実行するようにしてください。

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

于 2009-06-13T06:52:03.123 に答える
3

Boostがあなたにとってやり過ぎなら、GNU Gengetoptもおそらくそうですが、私見では、いじるのが楽しいツールです。

また、グローバル オプション オブジェクトから離れようとしています。各クラスに独自の構成を読み込ませることを好みます。「グローバルは悪」という哲学全体に加えて、すべての構成を 1 か所にまとめると、ますます混乱する傾向があり、どの構成変数がどこで使用されているかを判断するのも難しくなります。構成を使用されている場所の近くに置いておくと、それぞれの目的がより明確になり、クリーンな状態を維持しやすくなります。

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

于 2009-06-13T06:15:08.763 に答える
1

x86およびx64WindowsでVisualStudio2005を使用している場合は、SimpleLibPlusライブラリにいくつかの優れたコマンドライン解析ユーティリティがあります。私はそれを使用し、それが非常に有用であることがわかりました。

于 2009-06-13T13:50:05.050 に答える
1

GNU getopt はかなりいいです。C++ の感覚が必要な場合は、ネイティブ getopt のラッパーであるgetoptppを検討してください。構成ファイルに関する限り、解析が容易になるように、できるだけ馬鹿げたものにするようにしてください。少し気を配るなら、yaac&lex を使用したくなるかもしれませんが、それは小さなアプリには大きな出費になります。

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

于 2009-06-13T07:00:44.723 に答える
0

コマンドライン引数の解析については不明です。私はその分野で非常に豊富な機能を必要とせず、通常、ソフトウェアに依存関係を追加することを節約するために独自の機能を展開しました。ニーズに応じて、このルートを試してみたい場合とそうでない場合があります。私が作成した C++ プログラムは通常、コマンド ラインからは呼び出されません。

一方、構成ファイルの場合、XML ベースのフォーマットに勝るものはありません。読みやすく、拡張可能で、構造化されています... :) さらに、XML パーサーはたくさんあります。C ライブラリであるという事実にもかかわらず、私は xmlsoft.org の libxml2 を使用する傾向があります。

于 2009-06-13T05:35:46.380 に答える
-4

ApacheAntを試してください。その主な用途はJavaプロジェクトですが、Javaについては何もありません。また、ほとんどすべての用途に使用できます。

使い方はかなり簡単で、コミュニティのサポートもたくさんあります。それはあなたが求めている方法で物事を行うのが本当に得意です。

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

于 2009-06-13T05:25:00.163 に答える