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
}
Vijay
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
}
i
hat eine interne Verknüpfung, sodass Sie den Namen nicht verwenden können i
in anderen Quelldateien (ausschließlich Übersetzungseinheiten), um auf dasselbe Objekt zu verweisen.
j
hat externe Verknüpfung, so dass Sie verwenden können j
auf dieses Objekt verweisen, wenn Sie es deklarieren extern
in einer anderen Übersetzungseinheit.
Es sollte keinen Laufzeitunterschied geben, wenn Sie dasselbe tun, da der Compiler möglicherweise denselben Code generiert. Die Kompilierung kann bei einer globalen jedoch etwas länger dauern, da sie einen größeren Umfang hat.
– Florian Kastellane
25. Oktober 2016 um 8:14 Uhr
Ist es möglich, die Verknüpfung einer beliebigen Variablen zur Kompilierzeit (möglicherweise mithilfe der Compiler-Erweiterung) oder zur Laufzeit programmgesteuert zu bestimmen? Siehe: stackoverflow.com/q/65520719/9881330.
– pmor
7. Januar 2021 um 21:27 Uhr
Warum muss ich “extern” verwenden, um “j” zu deklarieren? Bedeutet dies, dass “int j;” ist eine Definition und keine Deklaration?
– Abdel Alem
5. August 2021 um 13:14 Uhr
Wallyk
i
ist außerhalb des Moduls nicht sichtbar; j
ist weltweit zugänglich.
Das heißt, ein anderes Modul, das damit verknüpft ist, kann dies tun
extern int j;
und dann in der Lage sein, den Wert zu lesen und zu schreiben j
. Dasselbe andere Modul kann nicht zugreifen i
könnte aber eine eigene Instanz davon deklarieren, sogar eine globale, die für das erste Modul nicht sichtbar ist.
Ist die ‘extern’ Deklaration notwendig?
– Thomas Matthäus
16. Februar 2010 um 18:32 Uhr
Es kommt auf die Umsetzung an. Gebrauch von extern
garantiert keine Störungen, sofern ein Modul das Symbol als Non-extern
und öffentlich (die es zuweist). Frühe Unix-Implementierungen haben Symbole mit demselben Namen zusammengeführt – ähnlich wie bei Fortran Common – so extern
war nicht erforderlich.
– Wallyk
16. Februar 2010 um 19:21 Uhr
Beachten Sie, dass „nicht sichtbar“ nicht bedeutet, dass es außerhalb des Geltungsbereichs 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, wenn das globale i außerhalb des Gültigkeitsbereichs wäre, wäre es egal, ob Sie ein statisches i in Ihrer .c-Datei deklariert hätten. Der globale wäre niemals sichtbar. Das statische i, das Vorrang vor einem globalen i hat, das in einer anderen Kompilationseinheit definiert ist, wird als „Shadowing“ bezeichnet. Es passiert auch mit Funktionslokalen und ist nicht nur eine C++/C-Sache.
– Jupiter
4. September 2013 um 14:23 Uhr
Der Unterschied ist das i
hat eine interne Verknüpfung, und j
hat eine externe Verlinkung. Dies bedeutet, dass Sie zugreifen können j
aus anderen Dateien, mit denen Sie verknüpfen, während i
ist nur in der Datei verfügbar, in der es deklariert ist.
Ramakrishna
i
werde haben statische Verknüpfungdh die Variable ist nur in der aktuellen Datei zugänglich.
j
sollte definiert werden als extern
das ist
extern int j;
in einer anderen Header-Datei (.h
), und dann wird es haben externe Verknüpfungund es kann dateiübergreifend darauf zugegriffen werden.
Sravya
Der Umfang der statischen Variablen/Funktion befindet sich in derselben Datei, obwohl Sie die Datei als Teil einer anderen Quelldatei enthalten.
Der Gültigkeitsbereich der globalen Variablen erstreckt sich über alle Dateien, in denen sie enthalten ist. Um die Variable in eine andere Quelldatei aufzunehmen, verwenden wir extern
vor der Variablendeklaration. In diesem Fall wird der Variable kein Speicher mehr allokiert.
extern
wird verwendet, um eine C-Variable zu deklarieren, ohne sie zu definieren. extern
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
wird in der Funktionsdeklaration/-definition nicht benötigt. Seine Verwendung ist überflüssig.
Lesen Sie die Antworten auf diese Frage: stackoverflow.com/questions/1358400/…
– Avakar
16. Februar 2010 um 9:56 Uhr
Unterschied zwischen statischer, automatischer, globaler und lokaler Variable im Kontext von c und c++
– phuklv
6. Juli 2017 um 16:38 Uhr