5

Cで、キーと値のペアを使用して、プレーンテキスト構成ファイル、環境変数、およびコマンドラインのオプションのいずれかまたはすべてを使用して、一部のプログラムの初期設定を構成する方法。また、どのメソッドの値が他の2つのメソッドの値よりも優先されるかを決定する方法。次に、値が変更されている場合は、オプションで構成ファイルを更新します。

これを行う最も簡単な方法は何ですか?もしあれば、最も受け入れられている方法は何ですか?これを行う方法の良い例を示す、できれば小さなオープンソースプログラムはありますか?

4

6 に答える 6

5

基礎:

  • 環境変数を使用してプログラムを構成するには、stdlib.h で定義されている getenv 関数を使用できます。
  • コマンド ライン引数を使用してプログラムを構成するには、メイン関数を 'int main(int argc, const char* const* argv)' のように宣言し、ループを使用して argv 配列内の引数を調べます。そのサイズは argc によって与えられます。
  • 構成ファイルを使用してプログラムを構成するには、別のカスタム構成ファイル形式を発明するのではなく、これを行うライブラリを選択することをお勧めします。ターゲットとするプラットフォームによっては、コマンドライン引数を解析するためのライブラリもあることに注意してください。

どの設定ソースを相互にオーバーライドするかはアプリケーションによって異なりますが、私の意見では、一般的にコマンドライン引数 > 環境変数 > 構成ファイルが最も理にかなっています。

コマンドラインが環境をオーバーライドして、環境とコマンドラインから構成を取得する例を次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char* const* argv) {
    int i;
    const char* myConfigVar;

    // get default setting from environment
    myConfigVar = getenv("MY_CONFIG_VAR");

    // if the variable wasn't defined, initialize to hardcoded default
    if (!myConfigVar)
        myConfigVar = "default value";

    // parse commandline arguments
    // start at 1, because argv[0] contains the name of the program
    for (i = 1; i < argc; ++i) {
        if (strcmp("--my-config-var", argv[i]) == 0) {
            if (i + 1 < argc)
                myConfigVar = argv[i + 1];
            else
                printf("missing value for my-config-var argument\n");
        }
    }

    printf("myConfigVar = '%s'\n", myConfigVar);
    return 0;
}

すぐに非常に長くて退屈になることがすでにわかっているので、目的のターゲットプラットフォーム用の既存のライブラリが存在する場合はそれを使用するか、少なくともこの種のコードをいくつかの関数に分解してください。

もう 1 つの興味深いオプションは、スクリプト言語をアプリケーションにバインドすることです。その後、アプリケーションは設定ファイルの読み取りと「実行」のみを行うことができ、ユーザーは環境から一部の設定を読み取り、コマンドラインから一部の設定を読み取るように設定ファイルを構成できます。例えば。ただし、これを行う価値があるかどうかは、アプリケーションのタイプとサイズ、およびターゲット ユーザーによって異なります。

于 2009-05-08T12:54:56.437 に答える
5

Eric Raymond は、The Art of Unix Programming のセクション 10 でこれについて多くをカバーしています。明らかにこれは Unix 中心ですが、原則のほとんどはどの OS でも適用できます。

于 2009-05-08T14:15:07.010 に答える
2

質問はひどく明確ではありません。質問は「どのようなメカニズムが存在するのか」、「引数と形式の規則は何ですか?」、または「どのように組み合わせる必要がありますか?」ですか?

(少なくともUNIXの世界では)いくつかのかなり標準的な方法があります。

  • 環境変数
  • 構成ファイル
  • コマンドライン引数
  • 上記のサブセットとして、コマンドラインで指定された構成ファイル

あなた自身のプログラムに使用する方法を選択するには、あなた自身の選択を凍結する前に、受け入れられた実践の規範から多くのプログラムを調べ、いくつかのブログを読み、いくつかの本を読んでください...

構成ファイルは、おそらくオペレーティングシステム間で最も移植性があります。

治療はかなり複雑になる可能性があります。コマンドライン引数が構成ファイルまたは環境変数の解釈に影響を与える可能性があるが、それでもコマンドラインで他のメカニズムを無効にしたい場合(良い考え)、3つのパスが必要になる場合があります。

  1. コマンドラインを解析し、以降の設定に影響する変数を設定します(どの構成ファイルを読み取るかなど)
  2. 構成ファイルと環境変数を処理します(どのような順序ですか?)
  3. コマンドラインを再実行して、他のすべての設定を上書きします。

UNIXの伝統では、とを見てgetoptくださいgetopt_long。次のようなツールも検討してくださいgengetopt

環境変数を設定するシェルスクリプトを作成することで、構成ファイルの問題を単純化できます(ただし、これによりUNIXモデルに固定されます)。プレーンテキストの解析は簡単でクロスプラットフォームですが、より多くのコードを書くことができます。標準フォーマットとライブラリを使用すると、ユーザーのビルド環境に要件が課せられますが、バグや混乱を防ぐことができます。


構成環境が複雑な場合は、必要に応じて渡すことができる構造に構成状態をカプセル化すると非常に役立ちます。これは、によって採用されたアプローチgengetoptであり、私はそれが有用であることがわかりました。

于 2009-05-08T12:34:18.967 に答える
2

さまざまな形式の構成ファイルの解析を処理するためのライブラリがたくさんあります。2つの一般的な選択肢として、XML形式とINI形式を探します。カスタムパーサーを作成することは、ほとんどまたはまったく利益がないために多くの作業になる可能性があるため、おそらく悪い考えです。これはINIファイルを解析するためのランダムなCライブラリです。XMLは演習として残されています

設定間の優先順位は通常、コマンドラインオプションが「環境」設定を上書きするようなものです。重要度の高い順に、このような優先順位を提案します。

  1. コマンドラインオプションは何でも上書きします
  2. 設定ファイルは次です
    • ユーザーのローカルファイルとシステムグローバルファイルに分割される場合があります
  3. 次は環境変数です

しかし、2と3は反転する可能性があります。

于 2009-05-08T12:31:20.397 に答える
1

この分野の Unix ライクなデザイン パターンについては、Raymond の「The Art of Unix Programming」を参照してください。環境変数や構成ファイルなどに対するコマンド ライン引数の優先順位付けについて説明します。

于 2009-05-08T14:30:21.357 に答える
1

Lua言語は、ツールのコレクション用に明確に定義された構成言語を用意する必要性に突き動かされて、部分的に開始されました。Lua を構成言語として統合するのは非常に簡単です。かなり完全な例は、書籍「Programming in Lua」にあります。この書籍の旧版はオンラインで入手できます。第 25 章では、Lua C API を使用して Lua を構成言語として組み込む方法と、これを行う理由について説明します。

于 2009-05-09T01:13:19.253 に答える