※本記事は広告を含みます。
ソフトウェア設計解説シリーズ
本記事は「ソフトウェア設計解説シリーズ」の1つです。
ソフトウェア設計を、組み込み開発の視点も交えて解説します。
C言語の static は、公開範囲を制限するために使われます。
static を付けると、その変数や関数は
同じファイルの中からしか見えなくなります。
つまり
- 他のファイルから参照できない
- 外部から呼び出せない
- 内部専用になる
という状態になります。
でも、ここで疑問が出てきます。
初心者さんわざわざ見えなくする必要あるんですか?



それが設計上すごく重要なんだ
この記事では、なぜ static で公開範囲を制限するのかを、設計目線で解説します。
staticの文法的な使い方はこちらの記事で解説しています。
staticは「このファイル専用」にするキーワード
例えば次のコード
static int counter;この変数は
このファイルの中でしか使えません。
他のファイルから
extern int counter;としても参照できません。
つまり
完全に内部専用の変数になります
なぜ公開範囲を制限するのか
理由は主に3つあります
① 名前の衝突を防ぐ
② 内部実装を隠す
③ 誤使用を防ぐ
これはソフトウェア設計の基本です。
① 名前の衝突を防ぐ
例えば別ファイルで同じ変数名を使うと
int counter;int counter;これはリンクエラーになります。
しかし static を付けると
static int counter;static int counter;これは問題ありません。
なぜなら
それぞれ別ファイル専用になるからです。
つまり static は
名前空間を分離する役割
を持っています。
② 内部実装を隠す(カプセル化)
例えばこの関数
static int calc_internal(void)
{
}これは外部から呼ぶ必要がない内部処理です。
このような関数は static にします。



外から呼べた方が便利では?



逆に呼べちゃうと困るんだ
例えば
- 想定外の使われ方をする
- 依存関係が増える
- 修正しづらくなる
つまり
設計が壊れやすくなる
static はこれを防ぎます。
③ 誤使用を防ぐ
static を付けないと
他のファイルから自由に使えます。
すると
- 勝手に値を書き換えられる
- 直接アクセスされる
- 依存が増える
例えば
int system_state;どこからでも変更可能になります。
しかし
static int system_state;なら
このファイルだけが管理できます。
つまり
責任範囲を明確にできる
staticはモジュール設計の基本
C言語では
1ファイル = 1モジュール
として設計することが多いです。
そのとき
外に公開するものだけ extern
内部専用は static
と分けます。
例
sensor.c
static int raw_value;
static void read_sensor(void)
{
}
int sensor_get(void)
{
read_sensor();
return raw_value;
}外部から見えるのは
sensor_get()だけになります。
内部実装は完全に隠されます。
これは
カプセル化
と呼ばれる設計です。
staticを使わないとどうなるか
全部公開状態になります。
int raw_value;
void read_sensor(void);
int sensor_get(void);すると
他ファイルから
- raw_value を直接変更される
- read_sensor を直接呼ばれる
設計が崩れます。
公開が必要な場合は、どの変数や関数を公開するのか考えたうえで、慎重に公開しましょう。
グローバル変数のexternを使った公開についてはこちらの記事で解説しています。
まとめ
static は公開範囲を制限するキーワードです。
static を使う理由は
- 名前衝突を防ぐ
- 内部実装を隠す
- 誤使用を防ぐ
つまり
モジュール設計のためのキーワード
です。
static は単なる文法ではなく
ソフトウェア設計において重要な役割を持っています。
この記事が参考になった方へ
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント