2011-01-02 9 views
32

可能性の重複:
What does “static” mean in a C program?何をANSI-Cで静的平均

staticキーワードは、Cで何を意味するのでしょうか?

私はANSI-Cを使用しています。いくつかのコード例では、変数の前と関数の前にstaticというキーワードを使用しています。変数を使用する場合の目的は何ですか?そして、関数を使用する場合の目的は何ですか?

+0

私はしましたが、正確な目的を理解することは困難です。私は変数を使うことについてほとんど理解できませんでした。関数と一緒に使う? – Sency

+1

これを見つけましたか?http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program –

+1

...またはこれ:http://stackoverflow.com/questions/943280/ c-static in-c-static in-c –

答えて

57

がある:staticキーワードでファイルスコープで定義されて

の1-変数、すなわち定義された外部の機能はそれだけで内部に表示されますファイル。他のファイルからアクセスしようとすると、リンク時に未解決のシンボルが表示されます。

2つの関数内のブロック内にあるstaticとして定義された変数は、同じコードブロックのさまざまな呼び出しで存続します。それらが初期化されて定義されている場合、それらは一度だけ初期化されます。 static変数は、通常、デフォルトで0に初期化されることが保証されています。

+8

1:staticは関数にも適用でき、外部に隠蔽することもできます。 – datenwolf

+6

それはこの質問の他の化身で言われましたが、Googleから来る人のために厳密に言えば1はファイルではなくコンパイル単位に当てはまります。 – Jared

+0

@Roux hass: "定義されていれば初期化されている"とはどういう意味ですか?それらが定義されたときにゼロ以外の値で初期化されていれば? – moonman239

30

static変数の記憶域分類子として使用される変数は、関数呼び出し間で値を保持する変数です。関数内の静的変数は、その関数だけが見ることができるグローバル変数です。このようにstaticを使用すると、スレッド内で使用されている関数は常にで安全になりません。は避けるべきです。

他の使用例はグローバルスコープ、つまりグローバル変数と関数で使用しています。静的関数とグローバル変数はコンパイル単位に対してローカルです。つまり、コンパイルされたバイナリのエクスポートテーブルには表示されません。オブジェクト。したがって、彼らは名前空間を汚染しません。問題のコンパイルユニット(すなわちCファイル)の外部からアクセスできない静的なすべての関数とグローバル変数を宣言するのは良い考えです!静的変数をヘッダファイルに入れてはならないことに注意してください(非常にまれな特殊ケースを除いて)。変数を定義するときにだけ簡単な答えとして、staticキーワードのための2つの用途は