C/C++ global vs. statisch global [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von Vladp
Vladp

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 führt derselbe Name dann in zwei verschiedenen Dateien zu Namenskollisionen?

Kann das jemand erklären?

  • Wenn beide Variablen in verschiedenen Dateien als statisch deklariert sind, sollte dies nicht zu einer Namenskollision führen. Ich habe gerade einen kurzen Test durchgeführt und es funktioniert wie erwartet. Wenn es bei Ihnen nicht funktioniert, posten Sie bitte den Code, wo es nicht wie erwartet funktioniert, was Sie erwarten und was Sie erhalten und welchen Compiler Sie verwenden.

    – Kevin

    20. Oktober 2011 um 14:15 Uhr

Benutzeravatar von Shahbaz
Shahbaz

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

ac:

#include <stdio.h>

int a;

int compute(void);

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

bc:

int a;

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

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

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

ac:

#include <stdio.h>

static int a;

int compute(void);

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

bc:

static int a;

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

Das bedeutet, dass jede Datei mit ihrer eigenen arbeitet a ohne von den anderen zu wissen.


Als Randnotiz ist es in Ordnung, einen von ihnen zu haben static und die anderen nicht, solange sie in verschiedenen Dateien sind. Wenn sich zwei Deklarationen in derselben Datei befinden (read Übersetzungseinheit), eines static und ein externsiehe diese Antwort.

  • Was ist mit dem Deklarieren eines statischen und des anderen nicht?

    – Kissaki

    30. August 2013 um 9:51 Uhr

  • @kissaki, wenn sich diese Deklarationen in verschiedenen Dateien befinden, ist es in Ordnung. Die Datei mit der statischen Deklaration würde diese statische Variable verwenden, die für andere Dateien unsichtbar ist. Alle Dateien mit der nicht statischen Variablendeklaration würden die gemeinsam genutzte globale Variable verwenden.

    – Shahbaz

    30. August 2013 um 19:29 Uhr

  • Wenn diese beiden Deklarationen, eine statische und eine externe, in dieselbe Datei geschrieben werden (Übersetzungseinheit lesen), lesen Sie diese Antwort.

    – Shahbaz

    30. August 2013 um 19:30 Uhr


  • Wie kompiliert man a.c und b.c ?

    – ljk321

    3. November 2015 um 10:43 Uhr

  • 0, 0 ist nicht falsch. Ohne staticdie Zwei as sind miteinander verknüpft, also sind sie gleich a. In dem printfSie drucken a und das Ergebnis von compute() was auch modifiziert a. C sagt, dass die Reihenfolge der Auswertung von Funktionsparametern nicht spezifiziert ist. Das bedeutet, dass der Compiler entweder zuerst berechnen könnte adann compute()oder zuerst compute() dann a. Im ersten Fall würden Sie bekommen 1, 0 und im zweiten Fall würden Sie bekommen 0, 0. Beide sind gültig und tatsächlich ist es ein Programmierfehler, sich auf eines der beiden Verhaltensweisen zu verlassen.

    – Shahbaz

    8. November 2015 um 15:46 Uhr

Ein Name, der in jeder Datei statisch ist, sollte nicht Namenskollisionen verursachen. Wenn Sie das sehen, posten Sie bitte einen (kurzen) Democode, der ihn zeigt, zusammen mit dem genauen Compiler, den Sie verwenden, damit wir den Code ordnungsgemäß überprüfen und, vorausgesetzt, er ist korrekt, den Compiler ordnungsgemäß verleumden.

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

namespace { 
    int not_a_static_variable;
}

Ganz ehrlich, nein, ich kann dem aber keinen großen objektiven Vorteil aufzeigen …

  • In all honesty, no I can't point to a lot of objective advantage to that though...… Vielleicht kann dieses Thema in irgendeiner Weise helfen: Warum ist unbenannter Namensraum eine „überlegene“ Alternative zu statischem?

    – Nawaz

    20. Oktober 2011 um 14:24 Uhr

  • C++11 hebt die Ablehnung statischer Objekte auf, sodass heutzutage keine Methode besonders „bevorzugt“ ist.

    – Mike Seymour

    20. Oktober 2011 um 14:38 Uhr

  • @MikeSeymour: Das stimmt auch.

    – Nawaz

    20. Oktober 2011 um 14:46 Uhr

  • @MikeSeymour: Die Entfernung der offiziellen Ablehnung bedeutet nicht, dass sie nicht bevorzugt wird. Wie ich zu sagen versuchte, gibt es sogar eine wenig Gründe, es zu bevorzugen, nur nicht viele (der einzige, dem ich jemals in echtem Code begegnet bin, war, etwas als Vorlagenparameter verwenden zu wollen, und zumindest persönlich erinnere ich mich immer nur daran, dass es ein- oder vielleicht zweimal vorgekommen ist).

    – Jerry Sarg

    20. Oktober 2011 um 14:49 Uhr


1415720cookie-checkC/C++ global vs. statisch global [duplicate]

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

Privacy policy