statisch - nur zur Begrenzung des Umfangs verwendet?

7

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?)

    
chronodekar 25.11.2009, 08:13
quelle

7 Antworten

11

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.

    
paxdiablo 25.11.2009, 08:28
quelle
5

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.

    
AnT 25.11.2009 08:29
quelle
4

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.

    
user181548 25.11.2009 08:15
quelle
3

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%     
zoul 25.11.2009 08:18
quelle
1

Eine Variable kann drei Arten von Speicher haben:

  1. Im statischen Bereich des Programms
  2. Ein Stapel (während des Funktionsaufrufs)
  3. Auf Heap (wenn Sie mit new / malloc reservieren)

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.

    
sud03r 25.11.2009 08:57
quelle
1

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:

%Vor%

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.

    
sth 25.11.2009 08:18
quelle
1

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:

  1. glb_var Bezeichner wird im initialisierten Datensegment gespeichert.

  2. Die Zählerkennung
  3. wird im nicht initialisierten Datensegment namens ".bss" gespeichert.

  4. Die statische Variable wird einmal initialisiert, und die Werte bleiben während Funktionsaufrufen erhalten, da die statische Variable im Datensegment nicht im Stack gespeichert wird, so dass statische Variablen während Funktionsaufrufen bestehen bleiben. So wird die Ausgabe des Programms sein: 0 5 10

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.

    
Ankur Trivedi 24.05.2016 09:15
quelle

Tags und Links