C 言語のストレージクラス理解: auto、extern、static、register を解説
C 言語におけるストレージクラスとは?
ストレージクラスは、変数のスコープ、配置場所、初期化、生存期間、アクセス可能性を定義します。C では、すべての変数は型を持つだけでなく、どこでどのようにアクセスできるかを決定するストレージクラスも割り当てられます。
標準的なストレージクラスは 4 つあります:
- auto – ローカル変数のデフォルト。
- extern – 別ファイルに存在するグローバル変数や関数を宣言。
- static – 変数の値を呼び出し間で保持し、可視性をファイルまたは関数に限定。
- register – 変数を CPU レジスタに格納するようコンパイラにヒントを与え、高速アクセスを狙う。
auto ストレージクラス
auto で宣言された変数 (ローカル変数のデフォルト) は、定義されたブロック内でのみ存在します。ブロックを抜けると破棄され、明示的に設定しない限り不定値で初期化されます。
int add(void) {
int a = 13;
auto int b = 48; // auto は省略可能
return a + b;
}
スコープのデモンストレーション:
#include <stdio.h>
int main(void) {
auto int j = 1;
{
auto int j = 2;
{
auto int j = 3;
printf("%d ", j); // 3 を出力
}
printf("\t%d ", j); // 2 を出力
}
printf("%d\n", j); // 1 を出力
}
出力: 3 2 1
extern ストレージクラス
extern キーワードは、別の翻訳単位で定義されている変数や関数を宣言します。ソースファイル間でのデータ共有を可能にします。
/* main.c */
#include <stdio.h>
extern int i; // 宣言
int main(void) {
printf("value of the external integer is = %d\n", i);
return 0;
}
/* original.c */
#include <stdio.h>
int i = 48; // 定義
両ファイルを同時にコンパイル: gcc main.c original.c -o program。./program 実行で出力:
value of the external integer is = 48
static ストレージクラス
static 変数はプログラムの期間中、値を保持します。ローカル static とファイルスコープ static の 2 通りで使用できます。
- ローカル static – 関数内でのみ可視だが、呼び出し間で持続。
- ファイルスコープ static – 宣言されたファイル内でのみ可視。
/* グローバル static */
static int counter = 7;
void next(void) {
/* ローカル static */
static int iteration = 13;
iteration++;
printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
while (counter < 10) {
next();
counter++;
}
return 0;
}
出力:
iteration=14 and counter=7 iteration=15 and counter=8 iteration=16 and counter=9
register ストレージクラス
頻繁にアクセスされ、CPU レジスタに収まる変数に register を使用。レジスタが不足している場合、コンパイラはヒントを無視することがあります。
#include <stdio.h>
int main(void) {
register int weight;
/* アドレス取得は失敗する */
// int *ptr = &weight; // コンパイルエラー
return 0;
}
コンパイル結果:
error: address of register variable 'weight' requested
まとめ表
| ストレージクラス | 宣言コンテキスト | 格納場所 | デフォルト値 | スコープ | 生存期間 |
|---|---|---|---|---|---|
| auto | 関数/ブロック内 | メモリ | 不定 | 関数/ブロック | 関数/ブロック |
| register | 関数/ブロック内 | CPUレジスタ | 不定 | 関数/ブロック | 関数/ブロック |
| extern | すべての関数の外側 | メモリ | ゼロ | プログラム全体 | プログラム実行中 |
| static (ローカル) | 関数/ブロック内 | メモリ | ゼロ | 関数/ブロック | プログラム実行中 |
| static (グローバル) | すべての関数の外側 | メモリ | ゼロ | ファイル | プログラム実行中 |
重要なポイント
- ストレージクラスは変数の可視性と生存期間を制御。
- 標準的なローカル変数には
autoを使用。 - パフォーマンスクリティカルなカウンターには
register(コンパイラサポートに依存)。 - 関数呼び出し間で状態を保持するか、ファイルスコープを限定するには
static。 - ソースファイル間で変数や関数を共有するには
extern。
C言語
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# static キーワード:静的変数、メソッド、クラスをマスターする
- C# 入れ子クラスを理解する:定義、使用法、継承
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
- C言語のストレージクラス:スコープ、ライフタイム、使い分け
- C++ストレージクラス完全解説:スコープ、ライフタイム、使い方
- C++インターフェース完全理解:抽象クラスと純粋仮想関数
- C#プログラム構造の理解:コアコンポーネントと例