Statisch vs. global

Lesezeit: 3 Minuten

Vijays Benutzeravatar
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
}

  • 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


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


wallyks Benutzeravatar
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 ikö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.

Benutzeravatar von Ramakrishna
Ramakrishna

i werde haben statische Verknüpfungdh die Variable ist nur in der aktuellen Datei zugänglich.

j sollte definiert werden als externdas 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.

Benutzeravatar von Sravya
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.

1419460cookie-checkStatisch vs. global

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy