C ストレージクラス

ストレージクラスは、Cプログラム内の変数/関数の格納場所、ライフサイクル、およびスコープ(有効範囲)を定義します。

これらの指定子は、修飾する型の前に置かれます。

以下にCプログラムで使用できるストレージクラスを示します:

  • auto
  • register
  • static
  • extern

auto ストレージクラス

autoauto ストレージクラスは、すべてのローカル変数のデフォルトのストレージクラスです。

関数内で定義された変数はデフォルトで auto ストレージクラスになります。これは、変数が関数の開始時に作成され、関数の終了時に破棄されることを意味します。

{
   int mount;
   auto int month;
}

上記の例では、同じストレージクラスを持つ2つの変数を定義しています。auto は関数内でのみ使用でき、つまり auto はローカル変数のみを修飾できます。

register ストレージクラス

registerregister ストレージクラスは、RAM ではなくレジスタに格納されるローカル変数を定義するために使用されます。これは、変数の最大サイズがレジスタのサイズ(通常は1ワード)に等しく、メモリ位置を持たないため、単項の '&' 演算子を適用できないことを意味します。

register ストレージクラスで定義された変数はレジスタに格納されるため、アクセス速度が速くなります。ただし、RAM に格納されていないため、アドレスを直接取得することはできません。頻繁にアクセスする必要がある変数に register ストレージクラスを使用すると、プログラムの実行速度を向上させることができます。

{
   register int  miles;
}

レジスタは、カウンタなど、高速アクセスが必要な変数にのみ使用されます。また、'register' と定義しても、変数がレジスタに格納されることを意味するわけではなく、ハードウェアと実装の制限に応じて、変数がレジスタに格納される可能性があることを意味することに注意してください。

static ストレージクラス

staticstatic ストレージクラスは、コンパイラに対して、変数がスコープに入るたびに毎回作成・破棄するのではなく、プログラムのライフサイクル全体にわたってローカル変数を存在させ続けるように指示します。したがって、static を使用してローカル変数を修飾すると、関数呼び出し間でローカル変数の値を保持できます。

static 修飾子はグローバル変数にも適用できます。static がグローバル変数を修飾すると、変数のスコープが宣言されたファイル内に制限されます。

グローバルに宣言された static 変数またはメソッドは、それらが static 変数またはメソッドと同じファイル内に現れる限り、任意の関数またはメソッドから呼び出すことができます。

静的変数はプログラム内で一度だけ初期化され、関数が複数回呼び出されても、その変数の値はリセットされません。

以下の例は、static がグローバル変数とローカル変数を修飾する適用例を示しています:

例

#include <stdio.h> /*関数宣言*/ void func1(void); static int count=10; /*グローバル変数 - static はデフォルト*/ int main() { while (count--) { func1(); } return 0; } void func1(void) { /*'thingy' は 'func1' のローカル変数 - 一度だけ初期化されます * 関数 'func1' を呼び出すたびに、'thingy' の値はリセットされません。*/ static int thingy=5; thingy++; printf("thingy は %d 、count は %d\n", thingy, count); }

この例では、count はグローバル変数として関数内で使用でき、thingy は static で修飾されているため、呼び出しのたびにリセットされません。

この例では、まだ説明していない関数とグローバル変数という2つの概念を使用しているため、現時点では理解できないかもしれません。完全に理解できなくても問題ありません。後の章で詳しく説明します。上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

 thingy 为 6 , count 为 9
 thingy 为 7 , count 为 8
 thingy 为 8 , count 为 7
 thingy 为 9 , count 为 6
 thingy 为 10 , count 为 5
 thingy 为 11 , count 为 4
 thingy 为 12 , count 为 3
 thingy 为 13 , count 为 2
 thingy 为 14 , count 为 1
 thingy 为 15 , count 为 0

extern ストレージクラス

externextern ストレージクラスは、他のファイルで宣言されたグローバル変数または関数を定義するために使用されます。extern キーワードを使用する場合、変数にはストレージ領域が割り当てられず、コンパイラに対してその変数が他のファイルで定義されていることを指示するだけです。

externextern ストレージクラスは、グローバル変数への参照を提供するために使用されます。グローバル変数はすべてのプログラムファイルから参照できます。extern を使用する場合、extern初期化できない変数については、変数名が以前に定義された格納場所を指すようにします。

複数のファイルがあり、他のファイルで使用できるグローバル変数または関数を定義している場合、他のファイルで extern を使用してextern定義済みの変数または関数への参照を取得できます。次のように理解できます。externextern は、別のファイルでグローバル変数または関数を宣言するために使用されます。

extern 修飾子は通常、2つ以上のファイルが同じグローバル変数または関数を共有する場合に使用されます。次に例を示します:

最初のファイル:main.c

例

#include <stdio.h> int count ; extern void write_extern(); int 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番目のファイルの externexternキーワードは、最初のファイル main.c ですでに定義されている countcountを宣言するために使用されます。ここで、これら2つのファイルをコンパイルします。次のようになります:

 $ gcc main.c support.c

これにより、a.out実行可能プログラムが生成されます。プログラムが実行されると、次の結果が生成されます:

count is 5
その他の拡張