wake-up-neo.com

C / C ++ global vs statisch global

Mögliches Duplikat:
statisch vs global

Ich bin verwirrt über die Unterschiede zwischen globalen und statischen globalen Variablen. Wenn statisch bedeutet, dass diese Variable nur für dieselbe Datei global ist, warum verursacht der gleiche Name in zwei verschiedenen Dateien Namenskollisionen?

Kann das jemand erklären?

50
Vladp

Globale Variablen (nicht static) sind vorhanden, wenn Sie die Datei .o Erstellen, die dem Linker zur Verwendung in anderen Dateien zur Verfügung steht. Wenn Sie also zwei solche Dateien haben, erhalten Sie eine Namenskollision bei a:

a.c .:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

b.c .:

int a;

int compute(void)
{
    a = 0;
    return a;
}

weil der Linker nicht weiß, welche der globalen a zu verwenden ist.

Wenn Sie jedoch statische Globale definieren, weisen Sie den Compiler an, die Variable nur für diese Datei zu behalten und den Linker nicht darüber zu informieren. Wenn Sie also static (in der Definition von a) zu den beiden von mir geschriebenen Beispielcodes hinzufügen, erhalten Sie keine Namenskollisionen, nur weil der Linker nicht einmal weiß, dass es ein a in einer der folgenden Dateien:

a.c .:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

b.c .:

static int a;

int compute(void)
{
    a = 0;
    return a;
}

Dies bedeutet, dass jede Datei mit ihrer eigenen a arbeitet, ohne die anderen zu kennen.


Als Randnotiz ist es in Ordnung, einen von ihnen static und den anderen nicht zu haben, solange sie sich in verschiedenen Dateien befinden. Befinden sich zwei Deklarationen in derselben Datei (Lese- Übersetzungseinheit ), ist eine static und eine extern angegeben, siehe - diese Antwort .

82
Shahbaz

Ein Name, der in jeder Datei statisch ist, sollte nicht Namenskollisionen verursachen. Wenn Sie das sehen, senden Sie bitte einen (kurzen) Demo-Code, der ihn zeigt, zusammen mit dem genauen Compiler, den Sie verwenden, damit wir den Code richtig verifizieren und davon ausgehen können, dass er korrekt ist, und den Compiler verunglimpfen.

Nur FWIW, die bevorzugte Methode in C++ ist, stattdessen einen anonymen Namespace zu verwenden:

namespace { 
    int not_a_static_variable;
}

Um ehrlich zu sein, nein, ich kann nicht auf viele objektive Vorteile hinweisen ...

8
Jerry Coffin