Statisch gegen global

Antworten:

69

ihat eine interne Verknüpfung, sodass Sie den Namen nicht iin anderen Quelldateien (ausschließlich Übersetzungseinheiten) verwenden können, um auf dasselbe Objekt zu verweisen.

jverfügt über eine externe Verknüpfung, sodass Sie jauf dieses Objekt verweisen können, wenn Sie es externin einer anderen Übersetzungseinheit deklarieren .

CB Bailey
quelle
2
Es sollte keinen Laufzeitunterschied geben, wenn Sie dasselbe tun, da der Compiler möglicherweise denselben Code generiert. Die Kompilierung kann bei einem globalen System jedoch etwas länger dauern, da sie einen größeren Umfang hat.
Florian Castellane
25

iist außerhalb des Moduls nicht sichtbar; jist global zugänglich.

Das heißt, ein anderes Modul, das damit verbunden ist, kann dies tun

extern int j;

und dann in der Lage sein, den Wert zu lesen und zu schreiben j. Das gleiche andere Modul kann nicht darauf zugreifen i, kann jedoch eine eigene Instanz deklarieren, auch eine globale, die für das erste Modul nicht sichtbar ist.

Wallyk
quelle
1
Ist die 'externe' Erklärung notwendig?
Thomas Matthews
1
Das hängt von der Implementierung ab. Die Verwendung von externwird garantiert keine Probleme verursachen, vorausgesetzt, ein Modul hat das Symbol als nicht externund öffentlich (was es zuweist). Frühe Unix-Implementierungen führten Symbole mit demselben Namen zusammen - ähnlich wie bei einem Fortran-Common - und waren daher externnicht erforderlich.
Wallyk
1
Beachten Sie, dass "Nicht sichtbar" nicht bedeutet, dass es außerhalb des Gültigkeitsbereichs liegt. Das heißt, wenn Sie ein i in einer anderen Kompilierungseinheit deklarieren und das statische i aus Ihrer .c-Datei entfernen würden, wäre das globale i für Ihre .c-Datei sichtbar. Im Gegensatz dazu wäre es egal, ob das globale i außerhalb des Gültigkeitsbereichs liegt, wenn Sie eine statische i in Ihrer .c-Datei deklariert haben. Das globale würde niemals sichtbar sein. statisches i, das Vorrang vor einem globalen i hat, das in einer anderen Kompilierungseinheit definiert ist, wird als "Shadowing" bezeichnet. Dies passiert auch bei Funktionslokalen und ist keine reine C ++ / C-Sache.
Jupiter
6

Der Unterschied besteht darin, dass ieine interne Verknüpfung und jeine externe Verknüpfung besteht. Dies bedeutet, jdass Sie von anderen Dateien aus zugreifen können, mit denen Sie verknüpfen, während dies inur in der Datei verfügbar ist, in der es deklariert ist.

Hans W.
quelle
4

iwird eine statische Verknüpfung haben , dh die Variable ist nur in der aktuellen Datei zugänglich.

jsollte definiert werden als extern, das heißt

extern int j;

in einer anderen Header-Datei ( .h), und dann hat es eine externe Verknüpfung und kann über Dateien hinweg zugegriffen werden.

Ramakrishna
quelle
2

Der Umfang der statischen Variablen / Funktionen befindet sich in derselben Datei, obwohl Sie die Datei als Teil einer anderen Quelldatei einschließen.

Der Umfang der globalen Variablen erstreckt sich über alle Dateien, in denen sie enthalten ist. Um die Variable in eine andere Quelldatei aufzunehmen, verwenden wir sie externvor der Variablendeklaration. In diesem Fall wird der Variablen kein Speicher mehr zugewiesen.

externwird verwendet, um eine C-Variable zu deklarieren, ohne sie zu definieren. externDas Schlüsselwort erweitert die Sichtbarkeit der C-Variablen und C-Funktionen. Da Funktionen standardmäßig im gesamten Programm sichtbar sind, ist die Verwendung von externin der Funktionsdeklaration / -definition nicht erforderlich. Seine Verwendung ist überflüssig.

Sravya
quelle