Statische Variable in einer Header-Datei

7

Statische Variable hat Dateiumfang. Sagen wir, ich habe zwei folgende Dateien:

  • file1.h
  • Datei1.cpp
  • file2.h
  • file2.cpp

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.

    
Chris_vr 18.02.2011, 11:06
quelle

3 Antworten

13

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 .

    
NPE 18.02.2011, 11:11
quelle
8

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:

%Vor%

Wird sich in folgendes verwandeln:

%Vor%

Was, wie Sie wissen, ungültig ist.

    
moatPylon 18.02.2011 11:17
quelle
2

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.

    
Mahesh 18.02.2011 11:17
quelle

Tags und Links