Cprogramming-c-storage-classes
C-ストレージクラス
ストレージクラスは、Cプログラム内の変数や関数の有効範囲(可視性)と寿命を定義します。 変更するタイプに先行します。 Cプログラムには4つの異なるストレージクラスがあります-
- auto
- 登録
- 静的
- 外面
自動ストレージクラス
*auto* ストレージクラスは、すべてのローカル変数のデフォルトストレージクラスです。
{
int mount;
auto int month;
}
上記の例では、同じストレージクラスで2つの変数を定義しています。 「auto」は、関数、つまりローカル変数内でのみ使用できます。
レジスタストレージクラス
*register* ストレージクラスは、RAMではなくレジスタに保存するローカル変数を定義するために使用されます。 これは、変数の最大サイズがレジスタサイズ(通常は1ワード)に等しく、単項 '&'演算子を適用できないことを意味します(メモリ位置がないため)。
{
register int miles;
}
レジスタは、カウンタなどの迅速なアクセスを必要とする変数にのみ使用する必要があります。 また、「レジスタ」を定義しても、変数がレジスタに格納されるわけではないことに注意してください。 これは、ハードウェアと実装の制限に応じて、レジスタに格納される可能性があることを意味します。
静的ストレージクラス
*static* ストレージクラスは、プログラムの有効期間中にローカル変数を作成および破棄するのではなく、スコープに出入りするたびにローカル変数を保持するようコンパイラーに指示します。 したがって、ローカル変数を静的にすると、関数呼び出し間で値を維持できます。
static修飾子は、グローバル変数にも適用できます。 これが行われると、その変数のスコープは、それが宣言されているファイルに制限されます。
Cプログラミングでは、 static がグローバル変数で使用されると、そのメンバーの1つのコピーのみがそのクラスのすべてのオブジェクトで共有されます。
#include <stdio.h>
/*function declaration*/
void func(void);
static int count = 5;/*global variable*/
main() {
while(count--) {
func();
}
return 0;
}
/*function definition*/
void func( void ) {
static int i = 5;/*local static variable*/
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修飾子は、以下で説明するように、同じグローバル変数または関数を共有する2つ以上のファイルがある場合に最も一般的に使用されます。
- 最初のファイル: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