Wenn ich eine C-Datei wie unten habe, was ist der Unterschied zwischen i
und j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
Wenn ich eine C-Datei wie unten habe, was ist der Unterschied zwischen i
und j
?
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main ()
{
//Some implementation
}
Antworten:
i
hat eine interne Verknüpfung, sodass Sie den Namen nicht i
in anderen Quelldateien (ausschließlich Übersetzungseinheiten) verwenden können, um auf dasselbe Objekt zu verweisen.
j
verfügt über eine externe Verknüpfung, sodass Sie j
auf dieses Objekt verweisen können, wenn Sie es extern
in einer anderen Übersetzungseinheit deklarieren .
i
ist außerhalb des Moduls nicht sichtbar; j
ist 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.
extern
wird garantiert keine Probleme verursachen, vorausgesetzt, ein Modul hat das Symbol als nicht extern
und öffentlich (was es zuweist). Frühe Unix-Implementierungen führten Symbole mit demselben Namen zusammen - ähnlich wie bei einem Fortran-Common - und waren daher extern
nicht erforderlich.
i
wird eine statische Verknüpfung haben , dh die Variable ist nur in der aktuellen Datei zugänglich.
j
sollte 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.
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 extern
vor der Variablendeklaration. In diesem Fall wird der Variablen kein Speicher mehr zugewiesen.
extern
wird verwendet, um eine C-Variable zu deklarieren, ohne sie zu definieren. extern
Das Schlüsselwort erweitert die Sichtbarkeit der C-Variablen und C-Funktionen. Da Funktionen standardmäßig im gesamten Programm sichtbar sind, ist die Verwendung von extern
in der Funktionsdeklaration / -definition nicht erforderlich. Seine Verwendung ist überflüssig.