7

私は C (C++ ではない) を使用していますが、グローバル変数の使用を避ける方法がわかりません。

私は C とその構文、および基本的なアプリケーションの書き方についてかなりよく理解していますが、プログラムを構成する適切な方法については確信が持てません。

本当に大きなアプリケーションは、グローバル変数の使用をどのように回避するのでしょうか? 少なくともいくつかは常に必要になると確信していますが、大規模なゲームや C で記述されたその他のアプリケーションの場合、それを行う最善の方法は何ですか?

厳密に C で書かれたオープンソースのソフトウェアで、私が見ることができるものはありますか? 頭に浮かんだことは何も思い浮かびません。それらのほとんどは C++ で書かれているようです。

ありがとう。

編集

これは、別のプロセス内の単なる DLL である単純な API フック アプリケーションでグローバル変数を使用する場所の例です。

このアプリケーションは、具体的には、別のアプリケーションで使用される API 関数をフックします。これは、WriteProcessMemory を使用してオリジナルへの呼び出しを上書きし、代わりに DLL への呼び出しにすることによって行われます。

ただし、API 関数をフック解除するとき、元のメモリ/マシン コードを書き戻す必要があります。

そのため、そのマシン コード用に単純なバイト配列を維持する必要があります。フックされている API 関数ごとに 1 つずつありますが、その配列はたくさんあります。

// Global variable to store original assembly code (6 bytes)
BYTE g_MessageBoxA[6];

// Hook the API function
HookAPIFunction ( "user32.dll", "MessageBoxA", MyNewFunction, g_MessageBoxA );

// Later on, unhook the function
UnHookAPIFunction ( "user32.dll", "MessageBoxA", g_MessageBoxA );

混乱している場合は申し訳ありません。

4

6 に答える 6

11

「本当に大きなアプリケーションは、グローバル変数の使用をどのように回避するのでしょうか?」

  1. 静的変数を使用します。関数が呼び出し間で何かを記憶する必要がある場合は、グローバル変数に対してこれを使用します。例:

    int running_total (int num) {
        static int sum  = 0;
        sum             += num;
        return sum;
    }
    
  2. パラメータを介してデータを渡し、値が 1 か所で定義され、main()必要な場所に渡されるようにします。

  3. 他のすべてが失敗した場合は、先に進んでグローバルを使用しますが、潜在的な問題を軽減するようにしてください.

    1. 少なくとも、命名規則を使用して潜在的な競合を最小限に抑えます。例: Gbl_MyApp_DeveloperName. したがって、すべてのグローバル変数はこの部分から始まりGbl_MyApp_ます。ここで、「MyApp」はアプリを説明するものです。
    2. 関数を目的別にグループ化して、特定のグローバルを必要とするすべてのものが同じファイルにあるようにしてください (妥当な範囲内)。次に、グローバルを定義してそのファイルに制限することができます (externキーワードに注意してください)。
于 2010-07-08T23:27:44.467 に答える
2

グローバル変数には有効な用途がいくつかあります。学校は、プログラマーが怠けたり、使いすぎたりしないようにするために、自分たちは悪だと教え始めました。データが本当にグローバルに必要であると確信している場合は、それらを使用してください。あなたが良い仕事をすることを心配していることを考えると、あなたが自分の判断で間違ったことをすることはないと思います.

于 2010-07-08T22:44:42.887 に答える
2

簡単です - 単にそれらを使用しないでください。main() 関数でグローバル変数になるものを作成し、そこからそれらを必要とする関数にパラメーターとして渡します。

于 2010-07-08T22:50:45.853 に答える
1

同じように、グローバルは悪く、読みやすさが低下し、エラーの可能性やその他の問題が増加すると思います。

私の例を説明します。私はmain()が本当にいくつかのことをしている。アクションのほとんどは、タイマーと外部割り込みから発生します。これらは、私が使用しているプラ​​ットフォーム、32ビットマイクロコントローラーのため、パラメーターのない関数です。パラメータを渡すことができません。さらに、これらの割り込みとタイマーは非同期です。最も簡単な方法は、グローバルな想像上の割り込みでバッファを埋めることです。このバッファはタイマー内で解析され、解析された情報は他のタイマーで使用、保存、送信されます。さて、メイン関数で割り込みフラグとプロセスをプルアップすることはできますが、重要なソフトウェアをそのように実行する場合はお勧めできません。

これは私を気分を害しない唯一の種類のグローバル変数です;-)

于 2013-03-09T20:07:18.307 に答える
1

私の大学で C を学ぶのに最も推奨されたオープンソース ソフトウェアは Linux だったので、そのソースからサンプルを入手できます。

于 2010-07-08T22:44:36.273 に答える
0

グローバル変数はほとんど避けられません。ただし、多くの場合、それらは過度に使用されます。これらは、適切なパラメーターを渡したり、適切なデータ構造を設計したりする代わりにはなりません。

グローバル変数が必要になるたびに、次のように考えてください。

于 2010-07-08T22:45:02.010 に答える