Frage Warum kann sich eine nicht statische Variable nicht in einer Headerdatei befinden?


Nimm zum Beispiel:

// myheader.h
static int myStaticVar = 0;
// If we remove 'static' the compiler will throw linker error.

void DoStuff();

// and myheader.cpp, and main.cpp;  etc

So würde ich es erklären:

Statische Variablen haben keine externe Verknüpfung und wenn wir kompilieren   ohne "statisch" "schließen" wir die statische Variable ein (was   global hier) in jeder Datei, die Duplikate und Linker erzeugen   einen Fehler werfen, da Mehrfachdeklaration nicht erlaubt ist.

Gibt es einen besseren Weg, das zu erklären? Vielen Dank.

PS: Werden wir statische Variablen (nicht über Mitglieder) in Header-Datei haben?


5
2017-10-21 08:45


Ursprung


Antworten:


Warum kann sich eine nicht statische Variable nicht in einer Headerdatei befinden?

Weil es bricht Eine Definitionsregel (ODR).
Wenn Sie die Headerdatei mit einer nicht statischen Variablen einschließen, wird die Deklaration der Variablen in jede Quelldatei eingefügt, in der sie enthalten ist. Somit haben Sie mehr als eine Definition einer Variablen in demselben Übersetzungseinheit, dies verletzt die ODR und daher wird der Linker Ihnen Verbindungsfehler geben.

Wie erklärt man statische Variablen, die in Header-Dateien deklariert sind?

Wenn Sie eine statische Variable in einer Headerdatei deklarieren, wird in jeder eine Kopie der Variablen erstellt Übersetzungseinheit wo die Header-Datei enthalten ist.

Das Deklarieren einer statischen Variable in der Header-Datei führt nicht zu mehreren Definitions-Fehlern, aber es erfüllt nicht den Zweck, eine globale Variable zu haben, deren Wert für alle Dateien, die darauf zugreifen, geteilt wird.

Sie können denken, dass, da Sie eine globale statische Variable verwenden, ihr Wert in verschiedenen Dateien beibehalten wird, aber wie oben erwähnt, hat jede Übersetzungseinheit ihre eigene Kopie der Variablen und es wird nicht erreicht, was Sie denken, dass Sie es erreichen.

Werden wir statische Variablen (nicht über Mitglieder sprechen) in Header-Datei haben?

Nein niemals! 

Wie deklarieren und definieren Sie globale Variablen?

Sie müssen verwenden extern Stichwort.

Fügen Sie die externe Deklaration der Variablen in eine Header-Datei ein. Der Header sollte von der Quelldatei enthalten sein, die die Variable definiert, und von allen Quellendateien, die auf die Variable verweisen. Einziger Quelldatei sollte definieren Die Variable. Auch nur eine Header-Datei sollte die Variable deklarieren.

Dateiname.h

extern int gVariable;  /* Declaration */ 

file1.cpp

#include "filename.h"  

/* Definition */ 
int gVariable = 37;    

void doSomething(void) 
{ 
    return gVariable++; 
} 

file2.cpp

#include "filename.h" 
#include <stdio.h>  
void doSomethingWithGlobal(void) 
{     
    printf("Global variable: %d\n", gVariable++); 
} 

9
2017-10-21 08:49



Lesen Sie zuerst diese Antwort zu einer ähnlichen Frage.

Um die Antwort auf Ihre Frage zu ergänzen, hier:

Wenn du #include eine Datei (jede Datei, .h Dateien sind eine gängige Konvention), Es wird fast nur in den Code kopiert. Wenn Sie eine nicht statische Variable in der Header-Datei haben und sie in zwei Quelldateien einschließen, Die Variable wird in beide Quelldateien kopiert und du bekommst einen Linkfehler, wie ich in der Antwort erklärt habe, die ich dir oben gesagt habe.

Wenn Sie eine globale Variable für viele Quelldateien freigeben möchten, sollten Sie Folgendes tun:

Im einziger Ihrer Quelldateien:

type global_var = default_value;

In der Header-Datei:

extern type global_var;

Auf diese Weise sehen alle Quelldateien dort ein global_var irgendwo in der Menge der Quelldateien. Nur eine der Quelldateien enthält diese Variable und wenn die Verknüpfung stattfindet, beziehen sich alle Quelldateien auf diese eine Instanz von global_var


1
2017-10-21 08:52



Die Headerdatei (.h) teilt Ihnen mit, was die Definitionsdatei (.cpp) tun soll.

Für eine Metapher - eine Header-Datei ist es, vielen Freunden zu sagen, dass Sie etwas tun werden, aber in Wirklichkeit werden Sie es einmal tun.


0
2017-10-21 09:00