2

コンソールベースのプログラムで作業するときは、getopt()またはコマンドライン引数を解析する傾向があります。getopt_longただし、ほとんどの場合、グローバル変数を使用して、すべての*.cファイルで使用できる構成パラメーターを格納することになります。

ですから、どのパターンを使用しているのか、そしてグローバル変数のより良い代替案は何かを知りたいと思います。

4

3 に答える 3

3

私は一般的に構造を定義します:

struct ConfigurationOpts {
    int interval;
    int fullscreen;
    /* ... */
};

のインスタンスへのポインターをstruct ConfigurationOpts他のモジュールに渡します。

int main() {
    struct ConfigurationOpts conf;

    /* ... */

    init_submodule1(&conf);
    init_submodule2(&conf);

    return 0;
}
于 2013-02-22T03:57:12.017 に答える
0
  1. カプセル化する

    グローバルに使用するすべての変数を構造体に入れます。

  2. スコープを最小限に保つ main から呼び出している関数だけがコマンド ライン パラメーターを必要とする場合は、コマンド ライン オプションを指定して構造体を渡します。それが複数の場所から呼び出されている場合は、

    hh : cmd-line オプションを持つグローバル変数を Declare+Define main.c : 変数を初期化 user1.c : hh 経由で変数を参照 user2.c : hh 経由で変数を参照

    • 寿命を最小限に抑える

(この場合、実際には適用できない可能性があります。) 構造体の使用が終わったら、オプションを使用して構造体を初期化しないでください。プログラム パスの途中にある場合もあれば、最後にある場合もあります。関数呼び出しの順序に依存するのではなく、構造体が初期化されているかどうかを示す変数を用意します。(あなたはインターンを信用していません! :))

于 2013-02-22T03:58:04.403 に答える
0

私は単一のレコードを使用して、システム全体のすべてのデータ、シングルトン パターンを保持します。アクセスは、静的ポインター (またはマクロ) の値をシングルトン レコードに返す関数を介して行われます。この方法により、拡張、永続性、レガシー バージョンの互換性など、あらゆる種類のオプションが可能になります。私は、システム全体のデータを勝手に散らばったグローバルに配置するプログラムでの苦痛な経験の後で、この方法を採用しました。

于 2013-02-22T03:59:43.020 に答える