Wie kann ich globale Variablen erstellen, die in C gemeinsam genutzt werden? Wenn ich es in eine Header-Datei lege, beschwert sich der Linker, dass die Variablen bereits definiert sind. Ist die einzige Möglichkeit, die Variable in einer meiner C-Dateien zu deklarieren und manuell extern
s oben in allen anderen C-Dateien einzufügen, die sie verwenden möchten? Das klingt nicht ideal.
82
extern
Variablen in C?Antworten:
In die Header-Datei schreiben Sie es mit
extern
. Und im globalen Bereich einer der c-Dateien deklarieren Sie es ohneextern
.quelle
In einer Header-Datei (shared.h):
Fügen Sie in jede Datei, in der Sie dieses globale Symbol verwenden möchten, einen Header mit der externen Deklaration ein:
Um mehrere Linkerdefinitionen zu vermeiden, muss nur eine Deklaration Ihres globalen Symbols in Ihren Kompilierungseinheiten vorhanden sein (z. B. shared.cpp):
quelle
In der Header-Datei
Header-Datei
In der Datei mit der Datei, die der Globale leben soll:
In den anderen Dateien, die die externe Version benötigen:
quelle
Sie fügen die Deklaration in eine Header-Datei ein, z
In einer Ihrer .c-Dateien definieren Sie sie im globalen Bereich.
Jede .c-Datei, auf
my_global
die zugegriffen werden soll, enthält die Header-Datei mit dem Eingangextern
.quelle
Wenn Sie Code zwischen C und C ++ freigeben, müssen Sie der
shared.h
Datei Folgendes hinzufügen :quelle
Es gibt einen saubereren Weg mit nur einer Header-Datei, so dass die Wartung einfacher ist. In der Kopfzeile mit den globalen Variablen wird jeder Deklaration ein Schlüsselwort vorangestellt (ich verwende common) und dann in nur einer Quelldatei wie folgt eingefügt
und alle anderen Quelldateien wie diese
Stellen Sie nur sicher, dass Sie keine der Variablen in der Datei globals.h initialisieren. Andernfalls beschwert sich der Linker weiterhin, da eine initialisierte Variable auch mit dem Schlüsselwort extern nicht als extern behandelt wird. Die Datei global.h sieht ähnlich aus
scheint für jede Art von Erklärung zu funktionieren. Verwenden Sie das allgemeine Schlüsselwort natürlich nicht für #define.
quelle