コンソールベースのプログラムで作業するときは、getopt()
またはコマンドライン引数を解析する傾向があります。getopt_long
ただし、ほとんどの場合、グローバル変数を使用して、すべての*.c
ファイルで使用できる構成パラメーターを格納することになります。
ですから、どのパターンを使用しているのか、そしてグローバル変数のより良い代替案は何かを知りたいと思います。
コンソールベースのプログラムで作業するときは、getopt()
またはコマンドライン引数を解析する傾向があります。getopt_long
ただし、ほとんどの場合、グローバル変数を使用して、すべての*.c
ファイルで使用できる構成パラメーターを格納することになります。
ですから、どのパターンを使用しているのか、そしてグローバル変数のより良い代替案は何かを知りたいと思います。
私は一般的に構造を定義します:
struct ConfigurationOpts {
int interval;
int fullscreen;
/* ... */
};
のインスタンスへのポインターをstruct ConfigurationOpts
他のモジュールに渡します。
int main() {
struct ConfigurationOpts conf;
/* ... */
init_submodule1(&conf);
init_submodule2(&conf);
return 0;
}
カプセル化する
グローバルに使用するすべての変数を構造体に入れます。
スコープを最小限に保つ main から呼び出している関数だけがコマンド ライン パラメーターを必要とする場合は、コマンド ライン オプションを指定して構造体を渡します。それが複数の場所から呼び出されている場合は、
hh : cmd-line オプションを持つグローバル変数を Declare+Define main.c : 変数を初期化 user1.c : hh 経由で変数を参照 user2.c : hh 経由で変数を参照
(この場合、実際には適用できない可能性があります。) 構造体の使用が終わったら、オプションを使用して構造体を初期化しないでください。プログラム パスの途中にある場合もあれば、最後にある場合もあります。関数呼び出しの順序に依存するのではなく、構造体が初期化されているかどうかを示す変数を用意します。(あなたはインターンを信用していません! :))
私は単一のレコードを使用して、システム全体のすべてのデータ、シングルトン パターンを保持します。アクセスは、静的ポインター (またはマクロ) の値をシングルトン レコードに返す関数を介して行われます。この方法により、拡張、永続性、レガシー バージョンの互換性など、あらゆる種類のオプションが可能になります。私は、システム全体のデータを勝手に散らばったグローバルに配置するプログラムでの苦痛な経験の後で、この方法を採用しました。