Wann sollte das statische Schlüsselwort vor globalen Variablen verwendet werden?

Lesezeit: 6 Minuten

Matts Benutzeravatar
Matt

Kann jemand erklären, wann Sie das Schlüsselwort static vor globalen Variablen oder Konstanten verwenden sollen, die in Header-Dateien definiert sind?

Nehmen wir zum Beispiel an, ich habe eine Header-Datei mit der Zeile:

const float kGameSpriteWidth = 12.0f;

Sollte dies haben static vor dem const oder nicht? Was sind einige Best Practices für die Verwendung static?

  • Beachten Sie, dass in C++ static ist impliziert (dh es ist static standardmäßig) für alle globalen Namensräume const-qualifizierte Variablen, obwohl ich empfehlen würde, sie als zu qualifizieren static unabhängig davon, damit die Absicht klar wird.

    – abc

    22. Februar 2020 um 20:03 Uhr

  • Siehe auch Wie verwende ich extern um Variablen zwischen Quelldateien zu teilen? Die Antworten dort erklären, wie man Werte teilt – und ein wichtiger Teil davon ist die Verwendung eines Headers zum Deklarieren von (but nicht define) Variablen, die gemeinsam genutzt werden. Wenn Sie keinen Header haben, in den Sie die Deklaration einfügen können, sollte die Variablendefinition statisch sein. Wenn Sie einen Header dafür haben, fügen Sie den Header dort ein, wo die Variable definiert ist (das wird nur eine Quelldatei sein) und wo sie verwendet wird (es könnten viele Quelldateien sein).

    – Jonathan Leffler

    2. Mai 2020 um 22:55 Uhr

Du solltest nicht definieren globale Variablen in Header-Dateien. Sie sollten sie in der .c-Quelldatei definieren.

  • Wenn die globale Variable nur innerhalb einer .c-Datei sichtbar sein soll, sollten Sie sie als statisch deklarieren.

  • Wenn eine globale Variable über mehrere .c-Dateien hinweg verwendet werden soll, sollten Sie sie nicht als statisch deklarieren. Stattdessen sollten Sie es extern in der Header-Datei deklarieren, die in allen .c-Dateien enthalten ist, die es benötigen.

Beispiel:

  • Beispiel.h

    extern int global_foo;
    
  • foo.c

    #include "example.h"
    
    int global_foo = 0;
    static int local_foo = 0;
    
    int foo_function()
    {
       /* sees: global_foo and local_foo
          cannot see: local_bar  */
       return 0;
    }
    
  • bar.c

    #include "example.h"
    
    static int local_bar = 0;
    static int local_foo = 0;
    
    int bar_function()
    {
        /* sees: global_foo, local_bar */
        /* sees also local_foo, but it's not the same local_foo as in foo.c
           it's another variable which happen to have the same name.
           this function cannot access local_foo defined in foo.c
        */
        return 0;
    }
    

  • Ich glaube, Sie haben den Punkt verfehlt. Dies ist eine Konstante Float, es ist nichts falsch daran, sie als statische Konstante in einer Header-Datei zu definieren und in jeder Übersetzungseinheit eine andere Kopie davon zu haben. Aber die meisten Leute würden einfach ein #define für ein Literal verwenden.

    – Steve Jessop

    6. Dezember 2009 um 22:43 Uhr

  • Die Frage war: “Kann jemand erklären, wann Sie das Schlüsselwort static vor globalen Variablen oder Konstanten verwenden sollen, die in Header-Dateien definiert sind?” Da OP Anfänger zu sein scheint, habe ich einfach die grundlegendste Regel zum Definieren globaler Variablen in C gegeben. Wie Sie selbst bemerkt haben, können Sie sich normalerweise nicht selbst Schaden zufügen, indem Sie globale _const_s in der Header-Datei verwenden (in C ist es in C ++ nicht so einfach ).

    – Tomek Szpakowicz

    7. Dezember 2009 um 6:29 Uhr

  • Schließlich ist es nur die Durchsetzung des Compilers. Und schließlich ist es nichts als menschlicher Wille…

    – smWikipedia

    30. März 2018 um 1:22 Uhr


  • Ist das Einfügen von example.h in foo.c notwendig?

    – Hammadisch

    4. Juni 2018 um 16:37 Uhr

  • für den extern global_foo-Teil ist es im Grunde die global_foo-Variable aus der Datei foo.c, die in die Datei example.h aufgerufen wird

    – imnotarobot

    12. Oktober 2021 um 16:24 Uhr

static rendert eine Variable lokal in der Datei, was im Allgemeinen eine gute Sache ist, siehe zum Beispiel diesen Wikipedia-Eintrag.

  • Ich glaube nicht, dass das mit “Dateien” zu tun hat, sondern mit “Kompilierungsmodulen”.

    – Khaled Alshaya

    6. Dezember 2009 um 21:09 Uhr

  • Wenn Variable nicht ist extern dann ist es nicht von außen zugänglich C Datei. Was bringt es dann, es als statisch zu definieren?

    – Alex

    16. Mai 2019 um 23:56 Uhr

  • @alex Eine sehr gute Frage. Standardmäßig sind globale Variablen extern, aber es ist trotzdem eine gute Praxis, sie als solche zu kennzeichnen.

    – Austin Salgat

    20. Dezember 2019 um 5:11 Uhr

  • @Arak um genau zu sein, es hat mit “Kompilierungseinheiten” zu tun – das ist die richtige Benennung, glaube ich. Ich weiß, dass diese Frage kein C++-Tag hat, aber die eigentlichen Kompilierungsmodule kamen zum neuen C++-Standard, um die Leute besser nicht zu verwirren.

    – Andrej Borissowitsch

    13. Juni 2021 um 22:50 Uhr

Ja, statisch verwenden

Verwenden Sie immer statischen Eingang .c Dateien, es sei denn, Sie müssen das Objekt von einer anderen referenzieren .c Modul.

Verwenden Sie niemals statische In .h Dateien, da Sie jedes Mal ein anderes Objekt erstellen, wenn es eingeschlossen wird.

  • Der Linker kann nicht sehen, dass es sich um Konstanten handelt, und all die verschiedenen Objekte wegoptimieren?

    – Trevor Hickey

    5. August 2015 um 18:25 Uhr

  • Aber sie sind keine Konstanten, und es ist wichtig, dass der Linker nicht versehentlich private Objekte zusammenführt, nur weil sie denselben Namen haben. Linker haben überhaupt keine Informationen auf hoher Ebene, sie beschäftigen sich nur mit Symbolen, Bitfolgen, Leerzeichen und Referenzen. Konstanten sind für Linker überhaupt nicht sichtbar, sie wirken sich nur auf generierten Code während der Kompilierung aus.

    – DigitalRoss

    6. August 2015 um 17:01 Uhr


  • Eine andere Art, dies zu sagen, ist: der gesamte Punkt von static ist zu ermöglichen denselben Namen als zwei unterschiedliche Objekte in zwei unterschiedlichen Modulen.

    – DigitalRoss

    20. April 2016 um 23:31 Uhr


Faustregel für Header-Dateien:

  • Deklarieren Sie die Variable als extern int foo; und eine entsprechende Initialisierung in eine einzelne Quelldatei einfügen, um einen modifizierbaren Wert zu erhalten, der von allen Übersetzungseinheiten gemeinsam genutzt wird
  • verwenden static const int foo = 42; um eine Konstante zu erhalten, die inliniert werden kann

Das statisch Schlüsselwort wird in C bis verwendet beschränken die Sichtbarkeit einer Funktion oder Variablen zu seiner Übersetzungseinheit. Die Übersetzungseinheit ist die ultimative Eingabe für einen C-Compiler, aus dem eine Objektdatei generiert wird.

Überprüfen Sie dies: Verknüpfung |
Übersetzungseinheit

static vor einer globalen Variablen bedeutet, dass auf diese Variable von außerhalb des Kompilierungsmoduls, in dem sie definiert ist, nicht zugegriffen werden kann.

Stellen Sie sich zum Beispiel vor, Sie möchten auf eine Variable in einem anderen Modul zugreifen:

foo.c

int var; // a global variable that can be accessed from another module
// static int var; means that var is local to the module only.
...

bar.c

extern int var; // use the variable in foo.c
...

Nun, wenn Sie erklären var Um statisch zu sein, können Sie nur von dem Modul aus darauf zugreifen foo.c einkompiliert wird.

Beachten Sie, dass ein Modul die aktuelle Quelldatei ist, Plus alle enthaltenen Dateien. dh Sie müssen diese Dateien separat kompilieren und dann miteinander verknüpfen.

Benutzeravatar von YesThatIsMyName
Ja, das ist mein Name

Der richtige Mechanismus für C++ in anonymen Namespaces. Wenn Sie etwas wünschen, das für Ihre Datei lokal ist, sollten Sie einen anonymen Namensraum anstelle des statischen Modifikators verwenden.

  • Ich denke, diese Antwort ist schlecht formuliert, zu prägnant und abseits des Themas (obwohl das OP dies nicht angibt, ist die Frage mit C und nicht mit C ++ gekennzeichnet).

    – p4010

    11. November 2019 um 14:46 Uhr

1420740cookie-checkWann sollte das statische Schlüsselwort vor globalen Variablen verwendet werden?

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

Privacy policy