はじめに
C言語では、
int x = 10;のように変数を宣言できます。
しかし、この変数はどこからでも使えるわけではありません。
変数には、「使える範囲」があります。
これを、スコープ(scope)と呼びます。
初心者が混乱しやすいポイント
C言語では、
- スコープ
- 記憶域期間
- メモリ領域
が非常に混同されやすいです。
例えば:
static int x;を見ると、
初心者さんstaticだからグローバル?
と思う人も多いです。
しかし、スコープと寿命は別です。



ローカル変数って、関数の外から使えないんですよね?



そう。それは “スコープ” が関数内だからなんだ



でもstaticを付けると値は残りますよね?



そこが重要。
“見える範囲” と “存在する期間” は別なんだよ
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


C言語の文法を基礎から体系的に解説するシリーズです。
- ローカル変数とは?
- グローバル変数とは?
- static変数とは?
- 記憶域期間とは?
- スコープとは? ← 今回
スコープとは?
スコープとは、「変数や関数が使える範囲」です。
つまり、どこから見えるかを表します。
ローカル変数のスコープ
例えば:
void func(void) {
int x = 10;
}この x は、func() の中だけで使えます。
これがローカル変数です。
ローカル変数についてはこちらの記事で解説しています。


外からは見えない
例えば:
void func(void) {
int x = 10;
}
int main(void) {
printf("%d\n", x);
}これはエラーになります。
なぜエラー?
これは、x のスコープ外だからです。
つまり、x は func() の中だけの変数ということです。
ブロックスコープ
C言語では、
{ }で囲まれた範囲を「ブロック」と呼びます。
ローカル変数は通常、宣言したブロック内
がスコープになります。
if文の中で宣言した場合
例えば:
if(flag) {
int x = 10;
}この x はif文の中だけで使えます。
if文についてはこちらの記事で解説しています。


外では使えない
if(flag) {
int x = 10;
}
printf("%d\n", x);これはエラーになります。
グローバル変数のスコープ
例えば:
int g_value;これはグローバル変数です。
通常は、複数の関数から使えるスコープになります。
グローバル変数についてはこちらの記事で解説しています。


staticグローバル変数は?
例えば:
static int g_value;です。
この場合はそのファイル内だけで使えます。
staticはスコープを制限する
ここ重要。
staticには、公開範囲を狭める役割があります。
つまり:
| 種類 | スコープ |
|---|---|
| 通常グローバル | 他ファイルから参照可能 |
| staticグローバル | ファイル内限定 |
です。
staticローカル変数のスコープ
例えば:
void func(void) {
static int x = 0;
}この x はスコープは func() 内です。
これがstatic変数です。
static変数についてはこちらの記事で解説しています。


でも値は残る
ここが初心者の混乱ポイント。
スコープ≠記憶域期間
です。
記憶域期間とは、「変数が存在している期間」です。
つまり、いつ生成され、いつ破棄されるかを表します。



ローカル変数なのに、なんで値が残るんですか?



“見える範囲” はローカルだけど、
“存在する期間” は長いからなんだ



なるほど…別物なんですね!
記憶域期間についてはこちらの記事で解説しています。


同名変数がある場合
例えば:
int x = 100;
void func(void) {
int x = 10;
printf("%d\n", x);
}この場合、内側の x が優先
されます。
これをシャドーイングという
外側の変数を、内側の変数が隠す現象です。
初心者は意図せずやりがちなので注意です。
関数にもスコープがある
例えば:
static void helper(void) {
}この関数は、ファイル内だけで使えます。
これをstatic関数と呼びます。
static関数についてはこちらの記事で解説しています。


なぜスコープを狭くするの?
ここはC言語で非常に重要な考え方です。
単に、「変数を見えなくする」ためではありません。
本質は、「影響範囲を小さくする」ことです。
公開範囲が広いと何が起きる?
例えばグローバル変数を大量に使うと、
int g_value;を、
- funcA()
- funcB()
- funcC()
- 別ファイル
など、どこからでも変更できるようになります。
すると、「誰が値を変更したのか」分かりにくくなります。
規模が大きいほど危険
小さいコードでは問題ありません。
しかし大規模開発では、
- 予期しない変更
- 状態依存
- 修正時の副作用
- デバッグ困難
が発生しやすくなります。
例えば消費税を0%に変更しようとしてもすぐに変えることができない、
ということが発生します。
スコープを狭くすることでその影響範囲を小さくできる場合があります。
詳しくはこちらの記事で解説しています。


「触れる人」を減らす
例えば:
static int device_state;にすると、そのファイル内だけでしか使えません。
つまり、勝手に触れる場所を減らせるということです。
これは「隠す」のではなく「守る」
初心者は、



見えなくする意味ある?
と思いがちです。
でも実際は、「安全に保つため」にやっています。
例えば:
- 他モジュールから誤って変更されない
- 内部実装を自由に変更できる
- 依存関係が減る
- バグ影響を局所化できる
という大きなメリットがあります。
ソフトウェア設計の基本思想
これはC言語だけではありません。
多くの言語で、「必要最小限だけ公開する」
という設計思想があります。
例えば:
- private
- public
- encapsulation(カプセル化)
なども同じ考え方です。
staticはC言語の「公開制御」
C言語にはクラスがありません。
その代わり、static で公開範囲を制御します。
つまり、static は単なる文法ではなく、
モジュール設計の重要機能ということです。
staticで公開範囲を制限する考え方についてはこちらの記事で解説しています。


組み込みでは特に重要
組み込みでは:
- ドライバ
- 通信
- 制御
- センサ
- OS層
など、多数のモジュールが連携します。
ここで公開範囲を適切に制御しないと、
どこからでも触れる危険なコードになってしまいます。
「必要な範囲だけ公開」が基本
だからC言語では、
- まずローカルで考える
- 必要ならstatic
- 本当に必要ならextern公開
という順番で設計することが多いです。
スコープまとめ
| 種類 | スコープ |
|---|---|
| ローカル変数 | ブロック内 |
| グローバル変数 | 複数関数 |
| staticグローバル | ファイル内 |
| static関数 | ファイル内 |
スコープと記憶域期間の違い
| 項目 | 意味 |
|---|---|
| スコープ | どこから見えるか |
| 記憶域期間 | いつまで存在するか |
まとめ
スコープとは、「変数や関数が使える範囲」です。
特に重要なのは、スコープと寿命は別ということです。
この違いを理解すると、
- static
- グローバル変数
- モジュール設計
の理解がかなり深まります。
この記事が参考になった方へ
スコープを含むC言語の基本文法をこちらの記事で整理しています。


エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。
副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。





コメント