C言語のstaticはなぜ必要?公開範囲を制限する設計のメリットを解説

目次

ソフトウェア設計解説シリーズ

本記事は「ソフトウェア設計解説シリーズ」の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 は単なる文法ではなく
ソフトウェア設計において重要な役割を持っています。

この記事が参考になった方へ

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次