In C static
kann entweder eine lokale Variable oder eine globale Funktion / Variable ohne externe Verknüpfung bedeuten. In C ++ kann es auch eine Membervariable oder Memberfunktion pro Klasse bedeuten.
Gibt es einen Hinweis darauf, wie es dazu kam, dass das static
-Schlüsselwort, das für den Mangel an externer Verknüpfung völlig irrelevant ist, als Mangel an externer Verknüpfung bezeichnet wird?
static
ist ein Speicherspezifizierer. Das Wort "statisch" bedeutet unveränderlich. "Speicher" bezieht sich darauf, wo sich das Objekt im Speicher befindet, d. H. Seine Adresse.
Ein Objekt mit static
Speicher befindet sich an einer konstanten Adresse.
Zufälligerweise hat ein Objekt mit extern
storage auch eine konstante Adresse. Aufgrund der Art, wie C- und C ++ - Programme miteinander verknüpft sind, ist dies eine Notwendigkeit. Und weil extern
das am wenigsten überraschende Verhalten ist, ist es auch der Standard.
Wenn du darüber nachdenkst, dass extern
ein zusätzliches Feature zu static
ist, denke ich, dass es ein bisschen mehr Sinn macht. Es ist ein wenig dumm, eine Funktion static
zu deklarieren, da es keine Alternative in einer vollständig kompilierten Sprache gibt, aber die Adresse einer Funktion ist statisch, auch wenn sie nicht von außen sichtbar ist.
Der wirklich inkonsistente Teil ist also, dass Klassenmitglieder, die zwischen verschiedenen Kompilierungseinheiten geteilt werden, als static
, nicht als extern
...
Die Verwendung eines bereits vorhandenen Schlüsselworts hat den Vorteil, dass der Sprache kein neues Schlüsselwort hinzugefügt wird, wodurch bestehende Programme unterbrochen werden könnten. Es kann verwirrend sein, aber es wird als eine Art "kleineres Übel" betrachtet.
Ich nehme an, dass Sie die Verwendung von statisch zum Definieren von Variablen betrachten, die ihren Wert zwischen Funktionsaufrufen als natürlich erhalten.
Betrachten Sie Folgendes:
%Vor%versus
%Vor% Von func
aus betrachtet, verhält sich x
in beiden Fällen gleich. Der Wert bleibt zwischen aufeinanderfolgenden Aufrufen erhalten. Der Unterschied zwischen den beiden ist, wer sonst x
sehen kann. In der ersten kann niemand. In der Sekunde kann jeder.
Dieses Konzept erstreckt sich auf statische Variablen im globalen Gültigkeitsbereich. Wenn Sie nur eine Variable deklarieren, kann sie jeder sehen. Wenn Sie diese Variable jedoch als statisch deklarieren, kann nur diese Datei sie sehen. Natürlich muss man berücksichtigen, dass es keinen zusätzlichen Spielraum gibt, um die Sichtbarkeit einzuschränken, aber die Idee ist da.
Die zusätzliche Bedeutung in C ++ für statische Member ist auch direkt analog zum ursprünglichen Beispiel. Eine einzelne Variable, die von allen Instanzen der Klasse gemeinsam genutzt wird.