グローバル変数を扱うにあたって初心者の段階では、
- コードが短い
- 状態が一つ
- 実行順が単純
そのため問題がなく正しいのです。
グローバル変数を扱うべきでない理由としては、設計の問題であり、文法の問題ではありません。
この記事ではそれぞれがそうであるという説明の後、悪い例を用いてグローバル変数が設計上で問題であることについて読み解いていきます。
文法の問題ではない
まず明確にしておくべき点があります。
グローバル変数を使うこと自体は、C言語の文法上まったく問題ありません。
グローバル変数を使ったコードは、
- 正しくコンパイルできる
- 正しく実行できる
- 意図どおりの結果を出す
という点で、完全に正しいCプログラムです。
ここが非常に重要です。
もしグローバル変数の使用が文法上の問題であれば、
- コンパイラがエラーを出す
- 使用自体が禁止されている
はずです。
しかし、現実にはそうなっていません。
それでも「使わない方がいい」と言われる理由は、
文法ではなく、設計の問題だからです。
グローバル変数が設計上問題になる理由
プログラムは基本的に
「入力 → 処理 → 出力」
の連続ですが、その間に処理途中で保持される値が存在します。
グローバル変数は、この状態を
- どの関数からでも
- 制約なく
触れる場所に置きます。
すると何が起きるかというと、
- 関数の戻り値を見ても、状態が分からない
- 実行順序を変えると壊れる
- 修正の影響範囲が予測できない
という状況になります。
グローバル変数を使用した設計上の悪い例

このコードは、文法的にも動作的にも正しいです。
問題は「正しく動くか」ではありません。
このコードを見て、事実として言えることは何でしょうか。
-
increment(void)は値を増やす reset_if_needed(void)は条件次第で値を変える
しかし、さらに別の関数にて、どちらかの関数が呼び出された場合、
- count がいつ 0 になるのか
- どの関数が最終的な値を決めているのか
- 処理順が変わったらどうなるのか
これらはコードを「すべて読まないと分かりません」。

↓main関数にてprocess_aとprocess_bが何度も呼び出された場合、どの呼び出しがcount変数に影響を与えたのかを、
各関数の定義だけでは判断できなくなります。
つまり「状態の変化を局所的に把握できなくなる」という状況が発生します。
これが、
グローバル変数が「文法的には正しいが、設計上危険」とされる理由です。
問題なのは可読性ではありません。
「処理途中で保持される値」の変更ルールがコード上に定義されていないことです。
まとめ
グローバル変数を使うべきではない理由は、コード単体を見た時ではなく、コード全体を見た時に設計上危険であるということが理由となります。
「値を共有すると危険」なのではなく、
「変更可能な状態の管理責任を曖昧にするから危険」だからなのです。
関連記事
C言語:

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