まず、どのアプリケーションでも、グローバルで定数でない変数を使用する理由はありません。プログラム全体で利用できるように、グローバル。
static
ファイルスコープ変数が意味をなす場合もあります。 static
キーワードは、変数がグローバルであることをブロックします。翻訳単位(cファイルとインクルードされたヘッダーを意味します)が宣言されている場合にのみ使用できます。
ような設計は理にかなっていくつかの例:自律コードモジュールを設計するとき
(クラス、のADTまたは何でもそれらを呼び出す)と、1つのインスタンスのみが存在することを確認することができ、使用すると便利かもしれませんstatic
ファイルスコープ変数を「poor man's private
」とします。呼び出し元に何らかのAPIを提供すると、ほとんどの場合、プライベート内部変数が必要になります。
この方法は、組み込みシステムでは一般的なシングルコアプログラミングです。再入力コードがはるかに重要であるデスクトッププログラミングではそれほど重要ではありません。
特別なケース。呼び出し元と割り込みサービスルーチンまたはコールバック関数の間で変数を共有する場合、パラメータ渡しはオプションではない可能性があります。そして、ファイルスコープ変数static
を使用する以外に選択肢はありません。
(このような変数は、コンパイラがISR /コールバックが実行されたことを認識していない場合には、コンパイラのオプティマイザのバグを防ぐためにvolatile
としてもを宣言する必要があります。)
唯一の理由何故なら何らかの理由で1つのファイルとして配信する必要があるライブラリを書いているので、2k LOCよりも大きなファイルを書くのはなぜですか?たとえば、標準Cライブラリのより複雑なライブラリファイルの1つを記述している場合です。
これはあなたがやっていることではない場合は、はありません。 6k LOCファイルの期間を書き留めてください。それを複雑なデータ型で埋めることはできません。
上記の最初のような場合でも、複数のファイルを分割することはありません。ほとんどの場合、実際には2k LOCを超えてエスカレートする "main.c"であり、分割が容易でなければなりません。
残念ながら、あなたが維持しているコードが初心者によって書かれていると思われます。それは珍しいことではありません、プロのプログラマーとして働く人は、最初の5年の間にそのようなモンスターを書きます。サウンドプログラムの設計は、経験を通してほとんどが学ぶものです。
IMOグローバルを悪用するメリットはあまりありません。プログラムは滑らかに速く動くかもしれませんが、少し小さくなるかもしれませんが、これはおそらく関連性がありません。 –
大域変数を広範囲に使用すると、テストや保守が難しい(あなたの言うように)コードになります。グローバルにはその用途と目的がありますが、私はそれらを広範な方法で使用することで利点を見ることはできません。 – Henningsson
と思うと、コードは小さなプログラマーからグローバルに成長し、複雑な遺産に発展しました。誰もそれをリファクタリングする時間と労力を費やしませんでした。なぜなら、それはちょうど働いたからです(ncars)。 –