【C言語】グローバル変数はなぜ使わない方がいいのか

グローバル変数を扱うにあたって初心者の段階では、

  • コードが短い
  • 状態が一つ
  • 実行順が単純

そのため問題がなく正しいのです。

グローバル変数を扱うべきでない理由としては、設計の問題であり、文法の問題ではありません。

この記事ではそれぞれがそうであるという説明の後、悪い例を用いてグローバル変数が設計上で問題であることについて読み解いていきます。

文法の問題ではない

まず明確にしておくべき点があります。
グローバル変数を使うこと自体は、C言語の文法上まったく問題ありません。

グローバル変数を使ったコードは、

  • 正しくコンパイルできる
  • 正しく実行できる
  • 意図どおりの結果を出す

という点で、完全に正しいCプログラムです。

ここが非常に重要です。

もしグローバル変数の使用が文法上の問題であれば、

  • コンパイラがエラーを出す
  • 使用自体が禁止されている

はずです。
しかし、現実にはそうなっていません。

それでも「使わない方がいい」と言われる理由は、
文法ではなく、設計の問題だから
です。

グローバル変数が設計上問題になる理由

プログラムは基本的に
「入力 → 処理 → 出力」
の連続ですが、その間に処理途中で保持される値が存在します。

グローバル変数は、この状態を

  • どの関数からでも
  • 制約なく

触れる場所に置きます。

すると何が起きるかというと、

  • 関数の戻り値を見ても、状態が分からない
  • 実行順序を変えると壊れる
  • 修正の影響範囲が予測できない

という状況になります。

グローバル変数を使用した設計上の悪い例

このコードは、文法的にも動作的にも正しいです。
問題は「正しく動くか」ではありません。

このコードを見て、事実として言えることは何でしょうか。

  • increment(void)は値を増やす
  • reset_if_needed(void) は条件次第で値を変える

しかし、さらに別の関数にて、どちらかの関数が呼び出された場合、

  • count がいつ 0 になるのか
  • どの関数が最終的な値を決めているのか
  • 処理順が変わったらどうなるのか

これらはコードを「すべて読まないと分かりません」

↓main関数にてprocess_aとprocess_bが何度も呼び出された場合、どの呼び出しがcount変数に影響を与えたのかを、
各関数の定義だけでは判断できなくなります。

つまり「状態の変化を局所的に把握できなくなる」という状況が発生します。

これが、
グローバル変数が「文法的には正しいが、設計上危険」とされる理由です。

問題なのは可読性ではありません。
「処理途中で保持される値」の変更ルールがコード上に定義されていないことです。

まとめ

グローバル変数を使うべきではない理由は、コード単体を見た時ではなく、コード全体を見た時に設計上危険であるということが理由となります。

「値を共有すると危険」なのではなく、
「変更可能な状態の管理責任を曖昧にするから危険」だからなのです。

関連記事

C言語:

【C言語】#defineとグローバル変数の違い

1 COMMENT

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です