ベストアンサー
型を混同しないでください(int
)宣言の他の側面(例:static
などのストレージクラス)。
つまり、次のようになります。
int x;
static int y;
x
およびy
は同じタイプint
(「データタイプ」という用語) CおよびC ++ではあまり一般的に使用されていませんが、間違いではありません。
キーワードstatic
は、Cでは3つの異なる意味を持っています。上記の例では、その変数y
は、その特定の翻訳ユニットに対して「プライベート」です(翻訳ユニットは、すべての#include
ディレクティブの後にソースファイルと見なすことができるためです。処理されました)。したがって、別の変換単位で宣言された変数y
はこれとは異なります。
これはstatic
in C:
void f() {
static int n = 2;
...
}
この静的は、変数は、f()
のすべての呼び出しで共有され、f()
が戻った後も存在し続けます(できますが、たとえば、ポインタを返します)。 n
から2
のみへの初期化は、プログラムの起動前に行われます。 Cで(C ++でのf()
の最初の呼び出しで)。したがって、2回目(およびそれ以降)のf()
が呼び出されると、n
は以前の値を保持します(プログラムが明示的に再度変更するまで) 。
3番目の意味はあまり一般的ではありません(そして、あまり知られていないと思います):
void g(double x[static 5]) {
...
}
これは、g()
は、配列形成の少なくとも5つのdouble
値の最初の値へのポインタでのみ呼び出すことができます。
編集:ローカルの説明を修正しました静的初期化(Jesse Pollardのコメントを参照)。
回答
静的は動的の反対です。え?これは、その変数に割り当てられたメモリがメモリ内で移動しないことを意味します。また、その変数にアクセスする関数を繰り返し呼び出すと、変数の新しいシャドウコピーが作成されないことも意味します。元の変数が使用され、そのアドレスでその変数にアクセスする他の関数は、それを変更または読み取ることができます。それ自体はグローバル変数ではありません。範囲は、定義された場所と方法と同じままです。しかし、そうかもしれません。ただし、同じファイルまたはアプリケーションに含まれている同じ名前の別の静的変数を定義しようとするとエラーになります。
単純なC追加関数を検討してください。
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
カウントと最後は静的に定義されます。つまり、それらに入力された値は、追加する複数の呼び出しにわたって持続します。 countとlastはゼロに初期化されますが、呼び出しごとに再ゼロ化されることはありません。 countとlastのスコープは、関数addのみの範囲内にあることに注意してください。これらは他の関数と共有したり、addの外部からアクセスしたりできないため、関数内から印刷する必要があります。他の関数も同じカウントと最後の静的変数を持つ可能性があり、それらは決して相互作用しません。
次に、このテストプログラムを見てください。
#include
static int count = 5;
static int last = 0;
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
int main(int argc, char**argv )
{
static int count = 10;
static int last = 0;
int i;
int a=1, b=1;
for(i = 0 ; i < count ; i++)
{
a = add(a, b);
b = add(a, last);
last = add(a, b);
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last);
return 0;
}
3セットの静的変数はカウントされ、最後になります。それらはすべて別々です。まず、グローバルです。ここでは使用されません。 main
には、ローカル変数がグローバルをシャドウイングするために使用する独自のセットがあります。 add
には、メインとグローバルの両方を同じ名前でシャドウする独自のセットがあります。
静的関数の定義は別の種類のものです。 staticという単語は、関数が定義されているソースからコンパイルされたファイルにのみ関数が表示されることを示します。これは、ソース( "。c")ファイルまたはヘッダー( "。h)スパン>ファイルが含まれています。これは、使用しているオブジェクトファイルに同じ名前の関数のバージョンが複数ある場合(add、print、errorなど)、オブジェクトファイルを組み合わせる場合に必要になることがあります(“。o”)モジュールは名前の衝突を引き起こさないため。