2010-05-06 1 views
8

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.Wie ist es passiert, dass "static" eine Funktion/Variable ohne externe Verknüpfung in C und C++ bezeichnet?

Gibt es einen Hinweis darauf, wie es dazu kam, dass das Schlüsselwort static, das für den Mangel an externer Verknüpfung völlig irrelevant ist, für den Mangel an externer Verknüpfung steht?

Antwort

4

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.

Es ist einfach so, dass ein Objekt mit extern Speicher auch eine konstante Adresse hat. 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 die Standardeinstellung.

Wenn Sie darüber nachdenken in Bezug auf extern ist ein zusätzliches Feature auf static, ich denke, es macht ein bisschen mehr Sinn. 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 inkonsequent Teil, dann ist, dass die Teilnehmer, die static, nicht extern ...

Die C-Version bedeutet
6

Die Verwendung eines bereits vorhandenen Schlüsselworts hat den Vorteil, dass der Sprache kein neues Schlüsselwort hinzugefügt wird, wodurch bestehende Programme beschädigt werden könnten. Es kann verwirrend sein, aber es wird als eine Art "kleineres Übel" betrachtet.

+3

Und statische hat, wie viele C++ - Schlüsselwort, eine kontextabhängige Bedeutung. – Klaim

6

Ich nehme an, dass Sie die Verwendung von statisch zur Definition von Variablen, die ihren Wert zwischen Funktionsaufrufen behalten, als natürlich betrachten.

Betrachten Sie das folgende:

void func() { 
    static int x; 
} 

gegen

int x; 
void func() { 
} 

Von func ‚s Sicht x das gleiche in jedem Fall verhält. Der Wert bleibt zwischen aufeinanderfolgenden Aufrufen erhalten. Der Unterschied zwischen den beiden ist, wer sonst noch 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 zu begrenzen, aber die Idee ist da.

Die zusätzliche Bedeutung in C++ für statische Elemente ist auch direkt analog zum ursprünglichen Beispiel. Eine einzelne Variable, die von allen Instanzen der Klasse gemeinsam genutzt wird.

+0

Ich bin überhaupt nicht zufrieden mit meinem Wortlaut: -/Grundsätzlich versuche ich zu vermitteln, dass alle drei Verwendungen im Wesentlichen zu einer globalen Variable führen, die auf den aktuellen Umfang beschränkt ist. –

+0

Das ist ** genau ** der Grund. Ich verstehe nicht, wie die obige (völlig nutzlose) Antwort mehr Stimmen bekommen hat! – Shahbaz

+0

Die klassenvariable Bedeutung wirft einen "Schraubenschlüssel" in den Teil "beschränkt auf den aktuellen Umfang". 'Klasse X {öffentlich: statisch int foo; }; 'deklariert ein global sichtbares' X :: foo' (wenn auch eines, das den 'X ::' Qualifier benötigt). – cHao

2

deklariert werden muss zwischen verschiedenen Übersetzungseinheiten geteilt bekommen „statisch gelinkte“ außerhalb einer Funktion.

Die C++ - Klassenversion und die C-internen Funktionsversionen bedeuten "statisch gespeichert", was bedeutet, dass sie keine (Stapel- oder lokalen) Variablen oder Instanzvariablen in Klassen sind.