C言語のストレージクラス:スコープ、ライフタイム、使い分け
ストレージクラスとは
ストレージクラスは、Cプログラム内の変数および/または関数のスコープ(可視性)とライフタイム(生存期間)を定義します。これらは修飾する型の前に記述します。Cプログラムには4つの異なるストレージクラスがあります:
- auto
- register
- static
- extern
autoストレージクラス
autoストレージクラスは、すべてのローカル変数のデフォルトストレージクラスです。
{
int mount;
auto int month;
}
上記例は同じストレージクラスの2つの変数を定義しています。'auto'は関数内、つまりローカル変数でのみ使用できます。
registerストレージクラス
registerストレージクラスは、RAMではなくレジスタに格納されるべきローカル変数を定義するために使用されます。これは変数の最大サイズがレジスタサイズ(通常1ワード)に等しく、単項'&'演算子を適用できない(メモリ位置を持たないため)ことを意味します。
{
register int miles;
}
registerはカウンタなど、素早いアクセスを必要とする変数にのみ使用すべきです。'register'を定義しても、その変数がレジスタに格納されることを保証するものではないことに注意してください。ハードウェアと実装の制約により、レジスタに格納される可能性があることを意味します。
staticストレージクラス
staticストレージクラスは、ローカル変数をプログラムのライフタイム中、存在し続けるようコンパイラに指示します。スコープに入ったり出たりするたびに作成・破棄されるのではなく、関数呼び出し間で値を保持できるようになります。
static修飾子はグローバル変数にも適用できます。これを行うと、その変数のスコープが宣言されたファイルに制限されます。
Cプログラミングにおいて、グローバル変数にstaticを使用すると、そのクラスのすべてのオブジェクトでそのメンバのコピーが1つだけ共有されます。
Live Demo#include <stdio.h>
/* 関数宣言 */
void func(void);
static int count = 5; /* グローバル変数 */
main() {
while(count--) {
func();
}
return 0;
}
/* 関数定義 */
void func(void) {
static int i = 5; /* ローカルstatic変数 */
i++;
printf("i is %d and count is %d\n", i, count);
}
実行結果:
i is 6 and count is 4 i is 7 and count is 3 i is 8 and count is 2 i is 9 and count is 1 i is 10 and count is 0
externストレージクラス
externストレージクラスは、すべてのプログラムファイルから参照可能なグローバル変数への参照を与えるために使用されます。'extern'を使用すると、変数を初期化できませんが、以前に定義されたストレージ位置を変数名が指すようになります。
複数のファイルがあり、グローバル変数や関数を定義して他のファイルでも使用する場合、externを別のファイルで使用して定義済み変数や関数への参照を提供します。理解のために言えば、externは別のファイルでグローバル変数や関数を宣言するために使用されます。
extern修飾子は、以下で説明するように、2つ以上のファイルが同じグローバル変数や関数を共有する場合に最もよく使用されます。
ファイル1: main.c
#include <stdio.h>
int count;
extern void write_extern();
main() {
count = 5;
write_extern();
}
ファイル2: support.c
#include <stdio.h>
extern int count;
void write_extern(void) {
printf("count is %d\n", count);
}
ここでは、externを使用して2番目のファイルでcountを宣言していますが、その定義は最初のファイルmain.cにあります。これら2つのファイルを以下のようにコンパイルします:
$ gcc main.c support.c
実行プログラムa.outが生成されます。このプログラムを実行すると:
count is 5
C言語
- 溝数がエンドミル性能に与える影響
- C++構造体とクラス:組み込み開発者のための実践ガイド
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
- C++ストレージクラス完全解説:スコープ、ライフタイム、使い方
- C++インターフェース完全理解:抽象クラスと純粋仮想関数
- C#のクラス完全ガイド:定義・カプセル化・コンストラクタ・デストラクタ・静的メンバー
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python list.count() 完全ガイド:実践例付きで徹底解説
- Javaオブジェクトとクラス:コアOOP概念を完全理解