Hoe een globale variabele declareren in C++

Ik weet dat je geen globale variabelen moet gebruiken, maar ik heb ze nodig. Ik heb gelezen dat elke variabele die buiten een functie wordt gedeclareerd, een globale variabele is. Dat heb ik gedaan, maar in een ander *.cpp-bestand kon die variabele niet worden gevonden. Het was dus niet echt wereldwijd. Is het niet zo dat men een header-bestand GlobalVariabels.h moet maken en dat bestand moet opnemen in een ander *cpp-bestand dat het gebruikt?


Antwoord 1, autoriteit 100%

Ik heb gelezen dat elke variabele die buiten een functie wordt gedeclareerd, een globale variabele is. Dat heb ik gedaan, maar in een ander *.cpp-bestand kon die variabele niet worden gevonden. Het was dus niet echt wereldwijd.

Volgens het concept van scopeis uw variabele isglobaal. Wat je hebt gelezen/begrepen is echter te vereenvoudigd.


Mogelijkheid 1

Misschien bent u vergeten de variabele declarerenin de andere vertaaleenheid (TU). Hier is een voorbeeld:

a.cpp

int x = 5; // declaration and definition of my global variable

b.cpp

// I want to use `x` here, too.
// But I need b.cpp to know that it exists, first:
extern int x; // declaration (not definition)
void foo() {
   cout << x;  // OK
}

Normaal gesproken plaatst u extern int x;in een headerbestand dat wordt opgenomen in b.cpp, en ook in elke andere TU die uiteindelijk moet worden gebruikt x.


Mogelijkheid 2

Bovendien is het mogelijk dat de variabele interne koppelingheeft, wat betekent dat deze niet zichtbaar is voor alle vertaaleenheden. Dit is standaard het geval als de variabele is gemarkeerd met const([C++11: 3.5/3]):

a.cpp

const int x = 5; // file-`static` by default, because `const`

b.cpp

extern const int x;    // says there's a `x` that we can use somewhere...
void foo() {
   cout << x;    // ... but actually there isn't. So, linker error.
}

U kunt dit oplossen door externook toe te passen op de definitie:

a.cpp

extern const int x = 5;

Deze hele malarky is ongeveer gelijk aan de puinhoop die je doormaakt om functies zichtbaar/bruikbaar te maken over TU-grenzen heen, maar met enkele verschillen in hoe je het aanpakt.


Antwoord 2, autoriteit 69%

U declareert de variabele als externin een algemene koptekst:

//globals.h
extern int x;

En definieer het in een implementatiebestand.

//globals.cpp
int x = 1337;

Je kunt de koptekst dan overal opnemen waar je toegang nodig hebt.

Ik stel voor dat je de variabele ook in een namespaceplaatst.


Antwoord 3, autoriteit 4%

In aanvulling op andere antwoorden hier, als de waarde een integrale constante is, zal een openbare opsomming in een klasse of structeur werken. Een variabele – al dan niet constant – aan de basis van een naamruimte is een andere optie, of een statisch openbaar lid van een klasse of struct is een derde optie.

MyClass::eSomeConst (enum)
MyNamespace::nSomeValue 
MyStruct::nSomeValue (static) 

Antwoord 4

Ik weet niet zeker of dit in zekere zin juist is, maar dit lijkt voor mij te werken.

someHeader.h
inline int someVar;

Ik heb geen problemen met koppelen/meerdere definities en het “werkt gewoon”… 😉

Het is best handig voor “snelle” tests… Probeer globale vars te vermijden, want iedereen zegt het… 😉


Antwoord 5

Declareer extern int x;in file.h.
En definieer int x;alleen in één cpp-bestand.cpp.

Other episodes