Kann jemand erklären, wann Sie das statische Schlüsselwort 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 static
vor const
oder nicht haben? Was sind einige Best Practices für die Verwendung static
?
static
impliziert sind (dhstatic
standardmäßig)const
, obwohl ich empfehlen würde, sie alsstatic
unabhängig zu qualifizieren, damit die Absicht klar wird.extern
Variablen zwischen Quelldateien freigeben? Die Antworten dort erklären, wie Werte geteilt werden - und ein wesentlicher Teil von ist die Verwendung eines Headers , um gemeinsam genutzte Variablen zu deklarieren (aber nicht zu definieren). Wenn Sie keinen Header zum Einfügen der Deklaration haben, sollte die Variablendefinition statisch sein. Wenn Sie einen Header dafür haben, fügen Sie den Header sowohl dort ein, wo die Variable definiert ist (das ist nur eine Quelldatei) als auch dort, wo sie verwendet wird (möglicherweise viele Quelldateien).Antworten:
static
rendert die Variable lokal in der Datei, was im Allgemeinen eine gute Sache ist, siehe zum Beispiel diesen Wikipedia-Eintrag .quelle
extern
ist, kann von außerhalb derC
Datei nicht darauf zugegriffen werden. Was bringt es dann, es als statisch zu definieren?Sie sollten nicht definieren globale Variablen in Header - Dateien. Sie sollten sie in der .c-Quelldatei definieren.
Wenn eine globale Variable nur in einer .c-Datei sichtbar sein soll, sollten Sie sie als statisch deklarieren.
Wenn eine globale Variable für mehrere .c-Dateien 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; }
quelle
Ja, statisch verwenden
Verwenden Sie in
.c
Dateien immer statisch , es sei denn, Sie müssen auf das Objekt eines anderen.c
Moduls verweisen .Verwenden
.h
Sie niemals statisch in Dateien, da Sie jedes Mal ein anderes Objekt erstellen, wenn es enthalten ist.quelle
static
besteht darin, zuzulassen , dass derselbe Name zwei verschiedene Objekte in zwei verschiedenen Modulen sind.Faustregel für Header-Dateien:
extern int foo;
Deklarieren Sie die Variable als und fügen Sie eine entsprechende Initialisierung in eine einzelne Quelldatei ein, um einen veränderbaren Wert zu erhalten, der von den Übersetzungseinheiten gemeinsam genutzt wirdstatic const int foo = 42;
diese Option, um eine Konstante zu erhalten, die eingefügt werden kannquelle
Das statische Schlüsselwort wird in C verwendet, um die Sichtbarkeit einer Funktion oder Variablen auf ihre Übersetzungseinheit zu beschränken . Die Übersetzungseinheit ist die ultimative Eingabe für einen C-Compiler, aus dem eine Objektdatei generiert wird.
Überprüfen Sie dies: Verknüpfung | Übersetzungseinheit
quelle
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 beispielsweise 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 ...
Wenn Sie sich jetzt
var
als statisch deklarieren , können Sie nur von dem Modul aus darauf zugreifen, in dasfoo.c
kompiliert wurde.Beachten Sie, dass ein Modul die aktuelle Quelldatei sowie alle enthaltenen Dateien ist. Das heißt, Sie müssen diese Dateien separat kompilieren und dann miteinander verknüpfen.
quelle
Der richtige Mechanismus für C ++ in anonymen Namespaces. Wenn Sie etwas möchten, das lokal für Ihre Datei ist, sollten Sie einen anonymen Namespace anstelle des statischen Modifikators verwenden.
quelle
Globale statische Variablen werden im Gegensatz zur automatischen Kompilierungszeit initialisiert
quelle