Beste Antwort
Verwechseln Sie keinen Typ (wie int
) mit anderen Aspekten von Deklarationen (z. B. einer Speicherklasse wie static
).
Dh in:
int x;
static int y;
x
und y
haben denselben Typ, int
(der Begriff „ Datentyp „) wird in C und C ++ weniger häufig verwendet; es ist jedoch nicht falsch).
Das Schlüsselwort static
hat in C drei verschiedene Bedeutungen. Im obigen Beispiel gibt es an Diese Variable y
ist für diese bestimmte Übersetzungseinheit „privat“ (da die Übersetzungseinheit nach allen #include
-Anweisungen als Quelldatei betrachtet werden kann verarbeitet wurden). Eine in einer anderen Übersetzungseinheit deklarierte Variable y
unterscheidet sich von dieser.
Hier ist ein Beispiel für die zweite Bedeutung von static
in C:
void f() {
static int n = 2;
...
}
Diese Statik bedeutet, dass die Variable n
wird von allen Aufrufen von f()
gemeinsam genutzt und bleibt auch nach der Rückkehr von f()
bestehen (Sie könnten, zB einen Zeiger darauf zurückgeben). Die Initialisierung von n
auf 2
erfolgt nur vor dem Programmstart in C (auf dem ersten Aufruf von f()
in C ++). Wenn also das zweite (und spätere) Mal f()
aufgerufen wird, behält n
den Wert bei, den es zuvor hatte (bis das Programm ihn explizit erneut ändert ).
Die dritte Bedeutung ist weniger verbreitet (und meiner Meinung nach weniger bekannt):
void g(double x[static 5]) {
...
}
Dies zeigt an, dass g()
kann nur mit einem Zeiger auf den ersten von mindestens 5 double
-Werten bei der Array-Bildung aufgerufen werden.
EDIT: Feste Erklärung von local statische Initialisierung als (siehe Jesse Pollards Kommentar).
Antwort
Statisch ist das Gegenteil von dynamisch. Huh? Dies bedeutet, dass sich der für diese Variable zugewiesene Speicher nicht im Speicher bewegt. Dies bedeutet auch, dass bei wiederholten Aufrufen von Funktionen, die auf diese Variable zugreifen, keine neuen Schattenkopien der Variablen erstellt werden. Die ursprüngliche Variable wird verwendet, und jede andere Funktion, die unter dieser Adresse auf diese Variable zugreift, kann sie ändern oder lesen. Es ist an sich keine globale Variable; Der Umfang bleibt derselbe wie wo und wie er definiert wurde. Es könnte jedoch sein. Es wäre jedoch ein Fehler, zu versuchen, eine andere statische Variable mit demselben Namen in derselben Datei oder in einer Anwendung zu definieren.
Betrachten Sie eine einfache C-Add-Funktion:
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
count und last sind statisch definiert. Das bedeutet, dass die darin eingegebenen Werte über mehrere Aufrufe zum Hinzufügen bestehen bleiben. count und last werden auf Null initialisiert, dann aber nicht bei jedem Aufruf erneut auf Null gesetzt. Beachten Sie, dass der Umfang von count und last nur innerhalb der Funktion add liegt. Sie dürfen nicht mit anderen Funktionen geteilt oder außerhalb von add aufgerufen werden. Um sie zu erreichen, müssen Sie sie aus der Funktion heraus drucken. Andere Funktionen könnten ebenfalls identische Anzahl und letzte statische Variablen haben und würden niemals interagieren.
Sehen Sie sich nun dieses Testprogramm an:
#include
static int count = 5;
static int last = 0;
int add(int a, int b)
{
static int count = 0;
static int last = 0;
count++;
last = a + b;
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last)
return last;
}
int main(int argc, char**argv )
{
static int count = 10;
static int last = 0;
int i;
int a=1, b=1;
for(i = 0 ; i < count ; i++)
{
a = add(a, b);
b = add(a, last);
last = add(a, b);
}
printf( "a:\t\%d \t\t b:\t\%d\n", a, b );
printf( "count:\t\%d \t\t last:\t\%d\n", count, last);
return 0;
}
Drei sind drei Sätze statischer Variablen zählen und zuletzt; Alle von ihnen sind getrennt. Erstens sind die Globalen, sie werden hier nie verwendet. main
hat einen eigenen Satz, den es verwendet, weil seine lokalen Vars die Globals beschatten. add
hat eine eigene Menge, die sowohl main als auch globals mit demselben Namen beschattet.
Statische Funktionsdefinitionen sind etwas anderes. Das Wort statisch gibt an, dass die Funktion nur in der Datei sichtbar ist, die aus der Quelle kompiliert wurde, in der die Funktion definiert ist. Dies ist entweder die Quelldatei (".c") oder ein Header (".h) Datei darin enthalten. Dies kann erforderlich sein, wenn die von Ihnen verwendeten Objektdateien mehr als eine Version einer Funktion mit demselben Namen haben (z. B. Hinzufügen, Drucken, Fehler usw.), sodass Objektdateien (". O") zusammen als Module verursachen keine Namenskollisionen.