Globale Variable in mehreren Dateien

73

Ich habe zwei Quelldateien, die auf eine gemeinsame Variable zugreifen müssen. Was ist der beste Weg, dies zu tun? z.B:

source1.cpp:

int global;

int function();

int main()
{
    global=42;
    function();
    return 0;
}

source2.cpp:

int function()
{
    if(global==42)
        return 42;
    return 0;
}

Sollte die Deklaration der Variablen global statisch oder extern sein oder sollte sie sich in einer Header-Datei befinden, die in beiden Dateien usw. enthalten ist?

Kaykun
quelle
Mögliches Duplikat dieser Frage .
Fredoverflow
8
Überarbeiten Sie den Code, um etwas anderes als globale Variablen zu verwenden - oder markieren Sie die Frage erneut als "C". Wenn ich ein globales Element in C ++ benötige, mache ich es normalerweise zu einem statischen Mitglied einer Klasse, die über eine Zugriffsmethode öffentlich lesbar ist. Umso besser, wenn der Bereich eingegrenzt werden kann, sodass nur interne Klassenmitglieder den Accessor verwenden. Nur wenige Variablen sind wirklich "global".
Steve Townsend
1
hängt davon ab, was Sie tun möchten
Chubsdad
function()ist auch beiden Quellen gemeinsam und benötigt die gleiche Behandlung. In Bezug auf globalden "besten Weg" ist das überhaupt nicht zu tun. eetimes.com/discussion/break-point/4025723/A-pox-on-globals
Clifford

Antworten:

118

Die globale Variable sollte externin einer Header-Datei deklariert werden, die in beiden Quelldateien enthalten ist, und dann nur in einer dieser Quelldateien definiert werden:

common.h

extern int global;

source1.cpp

#include "common.h"

int global;

int function(); 

int main()
{
    global=42;
    function();
    return 0;
}

source2.cpp

#include "common.h"

int function()
{
    if(global==42)
        return 42;
    return 0;
}
James
quelle
3
Wenn Sie weitere Informationen und Erklärungen dazu wünschen
Makesh
16

Sie fügen eine "Header-Datei" hinzu, die die Schnittstelle zum Modul source1.cpp beschreibt:

source1.h

#ifndef SOURCE1_H_
#define SOURCE1_H_

extern int global;

#endif

source2.h

#ifndef SOURCE2_H_
#define SOURCE2_H_

int function();

#endif

und fügen Sie in jede Datei eine # include-Anweisung ein, die diese Variable verwendet, und (wichtig), die die Variable definiert.

source1.cpp

#include "source1.h"
#include "source2.h"

int global;     

int main()     
{     
    global=42;     
    function();     
    return 0;     
}

source2.cpp

#include "source1.h"
#include "source2.h"

int function()            
{            
    if(global==42)            
        return 42;            
    return 0;            
}

Obwohl dies nicht erforderlich ist, schlage ich den Namen source1.h für die Datei vor, um zu zeigen, dass er die öffentliche Schnittstelle zum Modul source1.cpp beschreibt. Auf die gleiche Weise beschreibt source2.h, was in source2.cpp öffentlich verfügbar ist.

Harper
quelle
1

In einer Datei deklarieren Sie es als in source1.cpp, in der zweiten deklarieren Sie es als

extern int global;

Natürlich möchten Sie dies wirklich nicht tun und sollten wahrscheinlich eine Frage zu dem stellen, was Sie erreichen möchten, damit die Leute hier Ihnen andere Möglichkeiten geben können, dies zu erreichen.

Patrick
quelle
1
Sie sollten erreichen, dass der Compiler für jede Kompilierungseinheit, die die Deklaration benötigt, dieselbe externe Deklaration erhält. Wenn Sie die externen Dateien auf alle Dateien verteilen, die externen Zugriff auf die Variable, Funktion usw. benötigen, ist es schwierig, sie synchron zu halten. Deshalb: Deklarieren Sie extern nicht in der konsumierenden CPP-Datei.
Harper