Ist das Schlüsselwort static
in C nur dazu gedacht, den Gültigkeitsbereich einer Variablen auf eine einzelne Datei zu beschränken?
Ich muss wissen, ob ich das richtig verstanden habe. Bitte nehmen Sie die folgenden 3 Dateien an,
file1.c
%Vor%file2.c
%Vor%file3.c
%Vor%Wenn nun die 3 Dateien zusammen kompiliert werden, dann werden die Variablen "a" & amp; "b" sollte einen globalen Geltungsbereich haben und von jeder der 3 Dateien aus zugänglich sein. Aber, Variable "c" ist statisch, kann nur von file3.c zugegriffen werden, richtig?
Hat static
eine andere Verwendung in C? (Anders als den Umfang einer Variablen wie oben gezeigt zu begrenzen?)
Das Schlüsselwort static
dient zwei verschiedenen Zwecken in C, was ich Dauer (die Lebensdauer eines Objekts) und Sichtbarkeit (wo Sie ein Objekt verwenden können) nennen. Denken Sie daran, dass der C-Standard tatsächlich verschiedene Wörter für diese beiden Konzepte verwendet, aber ich habe herausgefunden, dass es am besten ist, die Begriffe des Alltags zu verwenden.
Wenn es auf Dateiebene (außerhalb einer Funktion) verwendet wird, steuert es die Sichtbarkeit. Die Dauer der Variablen, die auf Dateiebene definiert sind, ist bereits als die gesamte Dauer des Programms definiert, so dass Sie dafür nicht static
benötigen.
Statische Variablen auf Dateiebene sind für alles außerhalb der Übersetzungseinheit unsichtbar (der Linker kann sie nicht sehen).
Bei Verwendung auf Funktionsebene (innerhalb einer Funktion) wird die Dauer gesteuert. Das liegt daran, dass die Sichtbarkeit bereits als lokal für diese Funktion definiert ist.
In diesem Fall ist die Dauer der Variablen die gesamte Dauer des Programms und der Wert wird zwischen den Aufrufen der Funktion beibehalten.
Sie missbrauchen den Begriff "Geltungsbereich". static
in C hat absolut nichts mit dem Bereich zu tun.
Bereich ist der Bereich, in dem der Name einer Entität (Variable, Funktion, Typname usw.) sichtbar ist. In C-Sprache ist "Dateiumfang" der größte Umfang aller Zeiten. Aus diesem Grund hat es keinen Sinn, irgendetwas auf eine einzige Datei zu beschränken: Es gibt einfach nichts Größeres zu begrenzen. Es gibt keinen "globalen Geltungsbereich" in C. Der Begriff "globaler Geltungsbereich" wird manchmal informell verwendet, aber in diesem Fall hat er die gleiche Bedeutung wie "Dateiumfang".
Auch hier hat static
in C absolut nichts mit scope zu tun. static
in C beeinflusst Speicherdauer eines Objekts und Verknüpfung eines Bezeichners. Bei Verwendung mit Objekten (Variablen) gibt static
dem Objekt statische Speicherdauer (d. H. Das Objekt existiert, solange das Programm läuft). Und wenn es mit Bezeichnern von nicht-lokalen Objekten oder Funktionen verwendet wird, gibt es ihnen interne Verknüpfung , was bedeutet, dass sich dieselbe Bezeichner auf dieselbe Entität innerhalb einer einzelnen Übersetzungseinheit bezieht (wo die Entität definiert ist), aber nicht in anderen Übersetzungseinheiten.
static
wird auch innerhalb einer Funktionsdefinition verwendet, um eine Variable zu definieren, die ihren Wert zwischen Funktionsaufrufen behält. Ich fand hier ein Beispiel . Im Gegensatz dazu heißen Variablen, die bei jedem Funktionsaufruf neu erzeugt werden, automatisch.
Ein Beispiel, um Kinopikos Antwort zu verstärken:
%Vor%Dies kann zum Beispiel verwendet werden, um einen sicheren Zeiger auf eine lokale Funktionsvariable zurückzugeben. Oder in Objective-C wird es manchmal verwendet, um gegen wiederholte Klasseninitialisierung zu schützen:
%Vor%Eine Variable kann drei Arten von Speicher haben:
Globale Variablen werden immer im statischen Bereich gespeichert. Um jedoch eine lokale Variable im statischen Bereich zu speichern, benötigen Sie das Schlüsselwort static
. Da eine statische Variable nicht im Stack zugeordnet ist, können Sie bei nachfolgenden Aufrufen auf die Variable zugreifen.
Auch das static
-Schlüsselwort im globalen Gültigkeitsbereich gibt eine interne Variable für die Variable an. Daher kann die Variable nicht aus einer anderen Datei mit dem% code_% Qualifikationsmerkmal aufgerufen werden.
Sie haben Recht, dies wird als "statische Verknüpfung" bezeichnet: Das als static
deklarierte Symbol ist nur in der Kompilierungseinheit verfügbar, in der es definiert ist.
Die andere Verwendung von static
wäre innerhalb einer Funktion:
In diesem Fall wird die Variable nur einmal initialisiert und behält ihren Wert durch verschiedene Aufrufe dieser Funktion bei, wie es eine globale Variable wäre. In diesem Beispiel zählt die Variable counter
die Anzahl der Aufrufe der Funktion.
interne Verknüpfung vs externe Verknüpfung durch Beispiel
// Datei1.c
%Vor%Wenn wir dieses Programm kompilieren und dieses Programm ausführen, wird os dieses Programm in den Speicher laden. Dann werden die folgenden Dinge passieren:
glb_var Bezeichner wird im initialisierten Datensegment gespeichert.
wird im nicht initialisierten Datensegment namens ".bss" gespeichert.
eine wichtige Sache über statische Variable ist, dass es interne Verknüpfung.so können wir auf diese Variable auf eine bestimmte Datei zugreifen.In denen sie definiert sind (nicht in anderen Datei).
Wir können auf die globale Variable glb_var in einer anderen Datei zugreifen, indem wir external keyword verwenden. für zB:
// Datei2.c
%Vor%Ausgabe: 3 dies wird externe Verknüpfung genannt.