変数の前に static を使用すると、その値は、関数呼び出し間のプログラム実行のサイクル全体でそのまま残ります。しかし、関数で static を使用すると、関数が宣言されているファイルに対してローカルになります。私はこれが方法であることを知っていますが、その理由を正確に知りたいのですか? static が 2 つの方法で動作するのはなぜですか? 私はネットを試しましたが、うまくいきませんでした。説明してください! また、メモリ内のどこに静的関数が格納されるか教えてください。個人的にはスタックにあると思います!
3 に答える
私はそれについてコメントするのに十分な評判を持っていません。だからここに書く。
本「Expert C Programming - Peter van der Linden」から数行を引用すると、あなたの質問に答えるかもしれません。
問題の 1 つは、C が非常に簡潔であることです。単一の文字を追加、変更、または省略しただけで、まだ有効であるがまったく異なることを行うプログラムが得られることがよくあります。さらに悪いことに、多くの記号は「オーバーロード」されており、異なるコンテキストで使用すると異なる意味が与えられます。一部のキーワードでさえ、複数の意味でオーバーロードされています。これが、C スコープの規則がプログラマーにとって直感的に明確でない主な理由です。
static : 関数内では、呼び出し間でその値を保持します。関数レベルでは、このファイルでのみ表示されます
extern : 関数定義に適用され、グローバル スコープを持ちます (冗長です)。別の場所で定義された変数に適用
だから私が言いたかったのは、これらは言語のいくつかの落とし穴だということです. これが役立つかどうかはわかりません。
実際、キーワード static は、キーワード static で宣言された名前空間の関数と変数が内部リンケージを持つリンケージの指定子として使用される場合、関数と変数に対して同じ意味を持ちます。
C++ 標準から (3.5 プログラムとリンケージ)
3 名前空間スコープ (3.3.6) を持つ名前は、明示的にstaticと宣言された変数、関数、または関数テンプレートの名前である場合、内部リンケージを持ちます。
静的関数は、名前が外部名としてエクスポートされないことを除いて、他の関数と同じ方法で保存されます。
このキーワードは、変数に対してオーバーロードされます。また、静的ストレージ期間も示します。それはあなたがあなたの投稿で話していることです。
C++ 標準から (3.7.1 静的保存期間)
1 動的ストレージ期間を持たず、スレッドストレージ期間を持たず、ローカルではないすべての変数は、静的ストレージ期間を持ちます。これらのエンティティのストレージは、プログラムの期間中持続するものとします (3.6.2、3.6.3)。
3 キーワード static を使用して、静的ストレージ期間を持つローカル変数を宣言できます。
4 クラス定義でクラス データ メンバーに適用される static キーワードは、データ メンバーに静的ストレージ期間を与えます。
C++ のキーワード static には、クラスのメンバーに関連する 3 番目の意味があります (C にはクラスがないため、これは C には当てはまりません)。
1 クラスのデータまたは関数メンバーは、クラス定義で静的に宣言できます。この場合、それはクラスの静的メンバーです。
C では次のstatic
ことを意味します。
- 内部リンケージ。オブジェクトは他のコンパイル単位 (= 他の .c ファイル) からは見えません。
- オブジェクトはプログラムの最後まで存在します。
オブジェクトが変数か関数かは関係ありません。
static
変数のスコープは制限される可能性があることに注意してください。
static void A(void);
static int B;
void test(void) {
static int C = 0;
// A, B and C visible
}
void test2(void) {
// Only A and B visible
}
変数は長く存続する必要があるためstatic
、通常はプログラムの最初に割り当てられるため、必ずしもスタック上に存在するとは限りません。