Cストレージクラス
ストレージ クラスは、C プログラム内の変数/関数のスコープ (可視性) とライフサイクルを定義します。これらの指定子は、変更する型の前に配置されます。 C プログラムで使用できるストレージ クラスは以下のとおりです。
auto ストレージ クラス
auto ストレージ クラスは、すべてのローカル変数のデフォルトのストレージ クラスです。
{ int mount; auto int month;}
上記の例では、同じストレージ クラスを持つ 2 つの変数を定義しています。Auto は関数内でのみ使用できます。つまり、auto はローカル変数のみを変更できます。
register ストレージ クラス
register ストレージ クラスは、RAM の代わりにレジスタに格納されるローカル変数を定義するために使用されます。これは、変数の最大サイズがレジスタのサイズ (通常はワード) に等しく、単項 '&' 演算子を変数に適用できないことを意味します (メモリ位置がないため)。
{ register int miles;}
レジスタは、カウンターなど、すぐにアクセスする必要がある変数にのみ使用されます。 「レジスタ」の定義は、変数がレジスタに格納されることを意味するのではなく、ハードウェアと実装の制限に応じて、変数がレジスタに格納される可能性があることを意味することにも注意してください。
静的ストレージ クラス
static ストレージ クラスは、スコープに出入りするたびにローカル変数を作成して破棄することなく、プログラムの存続期間中ローカル変数を維持するようにコンパイラーに指示します。したがって、static を使用してローカル変数を変更すると、関数呼び出し間でその値が維持されます。
static 修飾子はグローバル変数にも適用できます。 static を使用してグローバル変数を変更する場合、変数のスコープはそれが宣言されているファイルに制限されます。
C プログラミングでは、static がクラス データ メンバーで使用されると、クラスのすべてのオブジェクトでメンバーのコピーが 1 つだけ共有されます。
#include <stdio.h> /* 函数声明 */void func(void); static int count = 5; /* 全局变量 */ main(){ while(count--) { func(); } return 0;}/* 函数定义 */void func( void ){ static int i = 5; /* 局部静态变量 */ i++; printf("i is %d and count is %d\n", i, count);}
この例はまだ理解できないかもしれません。なぜなら、私は関数とグローバル変数を使用しており、これら 2 つの概念についてはこれまで説明していないからです。今は完全には理解できていなくても、後続の章で詳しく説明しますので、問題ありません。上記のコードをコンパイルして実行すると、次の結果が生成されます。
i is 6 and count is 4i is 7 and count is 3i is 8 and count is 2i is 9 and count is 1i is 10 and count is 0
extern ストレージ クラス
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);}
ここで、2 番目のファイルの extern キーワードは、最初のファイル main.c で既に定義されている count を宣言するために使用されます。ここで、これら 2 つのファイルを次のようにコンパイルします。
$gcc main.c support.c
これにより、a.out 実行可能プログラムが生成され、プログラムが実行されると、次の結果が生成されます。