Wann sollte das statische Schlüsselwort vor globalen Variablen verwendet werden?
Lesezeit: 6 Minuten
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.
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.
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
14207400cookie-checkWann sollte das statische Schlüsselwort vor globalen Variablen verwendet werden?yes
Beachten Sie, dass in C++
static
ist impliziert (dh es iststatic
standardmäßig) für alle globalen Namensräumeconst
-qualifizierte Variablen, obwohl ich empfehlen würde, sie als zu qualifizierenstatic
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