Statische Variable hat Dateiumfang. Sagen wir, ich habe zwei folgende Dateien:
Ich habe in beiden Header-Dateien die statische Variable say static int Var1
deklariert. Sowohl file1.h
als auch file2.h
sind in main.cpp
Datei enthalten.
Ich habe dies getan, da die statische Variable einen Dateibereich hat, sodass sie sich nicht gegenseitig in Konflikt bringt. Aber nach der Kompilierung habe ich festgestellt, dass es Konflikt zeigt.
Jetzt verhält sich die statische Variable wie eine extern
Variable. Wenn ich andererseits die statische Variable in beiden CPP-Dateien deklariere, kompiliert es gut.
Ich kann dieses Verhalten nicht verstehen.
Kann jeder Körper erklären, wie Umfang und Verbindung in diesem Szenario funktionieren.
Statische Variablen sind lokal in der Übersetzungseinheit. Eine Kompilierungseinheit ist im Grunde eine .cpp
-Datei mit dem Inhalt der .h
-Datei, die anstelle jeder #include
-Direktive eingefügt wird.
Nun können Sie in einer Übersetzungseinheit nicht zwei globale Variablen mit demselben Namen haben. Dies ist in Ihrem Fall der Fall: main.cpp
enthält file1.h
und file.h
, und jeder der beiden Header definiert sein eigenes Var1
.
Wenn dies logisch zwei verschiedene Variablen sind, geben Sie ihnen unterschiedliche Namen (oder legen Sie sie in verschiedene Namespaces).
Wenn dies die gleichen Variablen sind, verschieben Sie sie in eine separate Header-Datei, var1.h
, und fügen Sie var1.h
sowohl von file1.h
als auch file2.h
hinzu, wobei Sie die # enthält Guard in var1.h
.
Statische Variablen haben einen Übersetzungseinheitsbereich (normalerweise eine .c
oder .cpp
-Datei), aber eine #include
-Direktive kopiert einfach den Text einer Datei wörtlich und erstellt keine weitere Übersetzungseinheit. Nach der Vorverarbeitung:
Wird sich in folgendes verwandeln:
%Vor%Was, wie Sie wissen, ungültig ist.
Angenommen, die statische Variable static int Var1
ist in beiden Headern im globalen Gültigkeitsbereich und enthält beide Header in main.cpp
. Nun kopiert der Pre-Prozessor zuerst den Inhalt der enthaltenen Dateien in main.cpp
. Da bei main.cpp
Var1
zweimal im selben Gültigkeitsbereich deklariert wird, treten mehrere Deklarationsfehler auf. (d. h. eine Kopie von file1.h
und die andere Form file2.h
vom Vorprozessor)
Jede Quelldatei wird einzeln kompiliert. Wenn Sie nun separat in ihren Quelldateien deklarieren, weiß jede Quelldatei nicht, dass die andere statische Variable in der anderen Quelldatei mit dem gleichen Namen vorhanden ist. Also meldet der Compiler keinen Fehler. Sie können es als extern markieren, wenn Sie möchten, dass eine Variable zwischen den Quelldateien geteilt wird.
Tags und Links c++ one-definition-rule