static ストレージ・クラス指定子を使用して、内部結合を持つオブジェクトまたは関数を定義することができます。つまり、特定の ID のそれぞれの インスタンスは、1 つのファイル内のみの同じオブジェクトまたは関数を表します。さらに、static として宣言されたオブジェクトは、静的ストレージ期間 を持ちます。つまり、これらのオブジェクトの メモリーは、プログラムの実行が開始したときに割り振られ、プログラムが終了すると解放されます。
オブジェクトの静的ストレージ期間は、ファイル・スコープまたはグローバル・ スコープと異なります。オブジェクトは静的期間を持つことができますが、 ローカル・スコープは持てません。一方、static ストレージ・クラス指定子は、ファ イル・スコープにある場合に限り、関数宣言で使用することができます。
static ストレージ・クラス指定子は、以下の名前だけに適用できます。
以下のものは、static として宣言できません。
キーワード static は、情報隠蔽を強化するための、C の主要なメカニズムです。
C++ は、ネーム・スペース言語フィーチャーおよびクラスのアクセス
制御を使用して、情報隠蔽を強化します。
C99 言語レベルで、static キーワー ドを関数に対する配列パラメーターの宣言で使用することができます。static キーワードは、関数へ渡された引き数が 少なくとも指定サイズの配列を指すポインターであることを知らせます。このようにして、ポインターの引き数は絶対にヌルではないことがコンパイラーに伝えられます。
外部変数のスコープを制限するキーワード static は、ネーム
・スペース・スコープ内のオブジェクトを宣言するためには使用しないようにしてください。
静的オブジェクトの初期化を、定数式、 またはすでに extern または static と宣言されているオブジェクトのアドレスに変換する式 (多くは定数式によって修正される) によって行えます。static (または外部) 変数を明示的に初期化しない場合 は、その初期値は、該当する型のゼロになります。
C における詳しい説明は、次のとおりです。
ブロック内の static 変数は、プログラムの実行前に一度だけ初期 化されます。一方、初期化指定子を持つ auto 変数は発生するごとに初期化されます。
再帰的関数は、呼び出されるごとに auto 変数の新規セットを入手します。ただし、関数が static 変数を持つ場合は、関数のすべての呼び出しで同じストレージ・ロケーションが使用されます。
クラス型の静的オブジェクトは、それを初期化しない場合は、
デフォルトのコンストラクターを使用します。
初期化されない自動変数およびレジスター変数は、未定義の値を持つことになります。
C++ では、非定数式を使用して static オブジェクトを初期化 できますが、以下の例は使用しないようにしてください。
static int staticInt = 5; int main() { // . . . }
C++ では、外部変数のスコープを制限するネーム・スペース言語フィーチャーが提供されます。
static ストレージ・クラス指定子を含み、ファイル・スコープを持つ オブジェクトまたはファイルの宣言は、ID の内部結合を示します。 したがって、特定の ID のそれぞれのインスタンスは、1 つのファイル内のみの同じオブジェクト または関数を表します。
例
例えば、静的変数 x が関数 f() で宣言されていると想定します。 プログラムが f() のスコープを終了するとき、x は破棄されません。 次の例は、このことを示しています。
#include <stdio.h> int f(void) { static int x = 0; x++; return x; } int main(void) { int j; for (j = 0; j < 5; j++) { printf("Value of f(): %d¥n", f()); } return 0; }
次に、上記の例の出力を示します。
Value of f(): 1 Value of f(): 2 Value of f(): 3 Value of f(): 4 Value of f(): 5x は静的変数であるので、f() への継続的な呼び出しで 0 に再初期化されることはありません。
関連参照