C ではstatic
、外部リンケージのないローカル変数またはグローバル関数/変数のいずれかを意味します。C++ では、クラスごとのメンバー変数またはメンバー関数を意味する場合もあります。
static
外部リンケージの欠如とはまったく無関係に見えるキーワードが、外部リンケージの欠如を示すために使用されたことがどのように起こったかについての言及はありますか?
static を使用して、関数呼び出し間で値を保持する変数を定義することは自然なことだと考えていると思います。
次の点を考慮してください。
void func() {
static int x;
}
対
int x;
void func() {
}
func
の観点からは、どちらの場合も同じように動作x
します。値は、連続する呼び出しの間も維持されます。この 2 つの違いは、他に誰が見ることができるかということx
です。最初は、誰もできません。第二に、誰もができる。
その概念は、グローバル スコープの静的変数にまで及びます。変数を宣言するだけで、誰でもそれを見ることができます。しかし、その変数を静的に宣言すると、そのファイルだけがそれを見ることができます。明らかに、可視性を制限する追加のスコープがないという事実を考慮に入れる必要がありますが、アイデアはそこにあります。
静的メンバーに関する C++ での追加の意味も、元の例に直接類似しています。クラスのすべてのインスタンスで共有される単一の変数。
既存のキーワードを使用すると、言語に新しいキーワードを追加しないという利点があり、既存のプログラムが壊れる可能性があります。紛らわしいかもしれませんが、一種の「悪」と考えられています。
static
ストレージ指定子です。「静的」という言葉は、変化しないことを意味します。「ストレージ」とは、オブジェクトがメモリ内のどこにあるか、つまりそのアドレスを指します。
ストレージを持つオブジェクトstatic
は、一定のアドレスに常駐します。
たまたま、ストレージを持つオブジェクトにextern
も一定のアドレスがあります。C と C++ プログラムがリンクされる方法により、これは必須です。そしてextern
、最も驚くべき動作ではないため、これがデフォルトでもあります。
extern
上の追加機能という観点からstatic
考えると、もう少し理にかなっていると思います。static
完全にコンパイルされた言語には代替手段がないため、関数を宣言するのは少しばかげていますが、関数のアドレスは外部から見えなくても静的です。
したがって、実際に一貫性のない部分は、異なるコンパイル単位間で共有されるクラス メンバーを宣言する必要がありstatic
、 … ではありませんextern
。</p>
Cバージョンは、関数の外部で「静的にリンクされている」ことを意味します。
C ++クラスバージョンとC内部関数バージョンは、「静的に格納された」ことを意味しauto
ます。つまり、クラス内の(スタックまたはローカル)変数またはインスタンス変数ではありません。