C++

C++-naamruimte

C++-naamruimte
Een naamruimte in C++ is een gegeneraliseerd bereik. De verklaring begint met het gereserveerde woord, namespace, gevolgd door een naam naar keuze van de programmeur en vervolgens het blok tussen accolades. Het blok bevat basisdeclaraties en/of definities van C++-objecten, -functies en andere entiteiten.

Beschouw de volgende twee scalaire instructies in een globaal bereik, in het volgende programma:

#include
namespace std; gebruiken;
int varId = 5;
float varId = 2.3;
int hoofd()

retourneer 0;

Een poging om dit programma te compileren leidt tot een compilatiefout. Er zijn twee variabelen met dezelfde naam, variId. Hoewel het twee verschillende variabelen van twee verschillende typen zijn, int en vlotter, de compiler verwerpt de twee verklaringen omdat ze dezelfde naam hebben. Het volgende programma lost dit probleem op door de variabelen met dezelfde naam in twee verschillende gegeneraliseerde bereiken te declareren:

#include
namespace std; gebruiken;
naamruimte NA

int varId = 5;

naamruimte NB

float varId = 2.3;

int hoofd()

cout << NA::varId << '\n';
cout << NB::varId << '\n';
retourneer 0;

De uitvoer is als volgt:

5
2.3

Er zijn twee naamruimten in het bovenstaande programma: NA, die de definitie heeft van een geheel getal, en NB, die de definitie heeft van een float maar met dezelfde naam als het gehele getal voor NA. Ten slotte, toen het programma werd uitgevoerd, werd dezelfde naam voor twee verschillende variabelen gebruikt. Merk op dat om toegang te krijgen tot dezelfde naam van twee verschillende variabelen, de specifieke naam voor de naamruimte moet worden gebruikt, gevolgd door de gemeenschappelijke identifier. De naamruimtenaam en de algemene id worden gescheiden door de operator voor bereikomzetting, "::."De naam van de naamruimten zal de objecten onderscheiden.

Dit artikel behandelt het basisconcept van een naamruimte en het gebruik ervan in de programmeertaal C++. Om dit artikel te volgen, moet u een basiskennis hebben van de C++-taal. U moet ook kennis hebben van de C++-scope, hoewel dit in dit artikel kort wordt uitgelegd. Zoek voor meer informatie over het bereik van C++ naar de zin "Scope in C++" (zonder aanhalingstekens) in het zoekvak van een willekeurige linuxhint.com webpagina en druk op Enter. Dit leidt je naar het artikel dat deze auteur heeft geschreven.

Artikel Inhoud

Wat is een naamruimte?

Een declaratief gebied is het grootste deel van een programma waarin de naam van een entiteit (variabele) geldig is. Dit gebied wordt een bereik genoemd. Een naamruimte in C++ is een gegeneraliseerd bereik waarvan het hoofddoel is om naamconflicten op te lossen. Een naamruimte heeft basisdeclaraties en/of definities van entiteiten.

Globale naamruimte en het probleem ervan

De globale naamruimte is het globale bereik. Beschouw het volgende korte programma:

#include
namespace std; gebruiken;
int ident = 55;
vlotter ident = 12.17;
int hoofd()

retourneer 0;

In het bovenstaande programma zijn er twee variabelen, beide genaamd ident. Deze variabelen vallen binnen het globale bereik; dat wil zeggen, ze bevinden zich in de globale naamruimte. Een poging om dit programma te compileren zal mislukken met een foutmelding. Het globale bereik accepteert niet meer dan één variabele met dezelfde naam, dus er is een aangepaste naamruimte nodig.

Aangepaste naamruimte

Een naamruimte heeft niet slechts één naam. In plaats daarvan heeft een naamruimte een reeks namen om conflicten met andere reeksen namen te voorkomen. Om conflicten lager in de code te voorkomen, laat u elke naam voorafgaan door de naam van de naamruimte en :: . Het volgende programma illustreert dit met behulp van twee aangepaste naamruimten:

#include
namespace std; gebruiken;
naamruimte NA

int varInt = 6;
vlotter flt;

naamruimte NB

int varInt = 7;
vlotter flt;

int hoofd()

cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NVT::flt = 2.5;
NB::flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
retourneer 0;

De uitvoer is:

6
7
2.5
4.8

Merk op dat de namen NA::flt en NB::flt zijn uiteindelijk gedefinieerd in de hoofd() functie. C++ staat een dergelijke definitie niet toe in het globale bereik.

Merk op dat de aangepaste naamruimte een geneste naamruimte is voor de globale naamruimte.

De gebruiksrichtlijn

Om te voorkomen dat u de hele tijd "namepace::name" typt in plaats van alleen "name" na het declareren van de naamruimte, kunt u de gebruik makend van richtlijn. De syntaxis om de . te gebruiken gebruik makend van richtlijn is als volgt:

naamruimte gebruiken Naamruimtenaam;

De gebruik makend van richtlijn is geen preprocessor-richtlijn, dus het eindigt met een puntkomma (;).

Het volgende programma illustreert het gebruik van de gebruik makend van richtlijn en meer:

#include
namespace std; gebruiken;
naamruimte NB

int varInt = 7;
int-functie ()

retour varInt;


int fn()

gebruik van naamruimte NB;
int mijnVar2 = func();
//andere objecten en functies van NB volgen.
retourneer mijnVar2;

int mijnVar3 = NB::func();
int hoofd()

cout << fn() << " << myVar3 << '\n';
retourneer 0;

De uitvoer van dit programma is: 7 7. De voorwaarde "gebruik van naamruimte NB;” is geplaatst aan het begin van de fn() definitie. De func() uit de NB-naamruimte wordt net daaronder aangeroepen, zonder voorafgegaan door “NB::.”

Een variabele gedeclareerd in het globale bereik (algemene naamruimte) wordt gezien vanaf het declaratiepunt tot het einde van het bestand. Het wordt ook gezien in de geneste naamruimten (geneste bereiken), zoals de geneste fn() functiebereik hierboven:. De gebruik makend van richtlijn voegt zich bij de naamruimte vanaf de positie waarop deze is geplaatst tot het einde van de scope waarin deze is geplaatst.

De naam func() uit de NB-naamruimte is niet zichtbaar onder de fn() definitie omdat “gebruik van naamruimte NB;” werd geplaatst binnen het functiebereik (blok). Gebruik onder deze voorwaarde "func()” buiten het NB-naamruimteblok (scope), moet het worden voorafgegaan door “NB::,” zoals in de volgende verklaring:

int mijnVar3 = NB::func();

De gebruik makend van richtlijn voegt zijn naamruimte samen met de buitenste geneste naamruimte vanaf de positie waarop deze is geplaatst tot aan het einde van de buitenste nestende naamruimte. In het volgende programma wordt de NA-naamruimte samengevoegd met de globale naamruimte. Beide naamruimten strekken zich vervolgens uit in de fn() functiedefinitie naamruimte, waarin ze worden samengevoegd met de NB-naamruimte. De NB-naamruimte eindigt aan het einde van de fn() functiedefinitie, en de twee vorige naamruimten gaan door tot het einde van het bestand (lees de code door).

#include
namespace std; gebruiken;
naamruimte NA

int varInt = 6;
int-functie ()

retour varInt;


naamruimte NB

int varInt = 7;
int-functie ()

retour varInt;


gebruik van naamruimte NA;
int mijnVar0 = varInt;
//andere objecten en functies van :: en NB volgen.
int fn()

int mijnVar1 = varInt;
gebruik van naamruimte NB;
int mijnVar2 = NB::func();
//andere objecten en functies van NB volgen, tot het einde van deze scope.
retourneer mijnVar1 + mijnVar2;

//Alleen objecten en functies van :: en NB volgen.
int mijnVar3 = NB::func();
int hoofd()

cout << myVar0 << " << fn() << " << myVar3 << '\n';
retourneer 0;

De uitvoer is: 6, 13, 7.

Opmerking: De globale naamruimte wordt aangegeven met :: , wat betekent dat er niets is voor de scope resolutie-operator die volgt.

Onder de verklaring, de “gebruik van naamruimte NA;"variabelen uit de globale en NA-naamruimten kunnen worden gebruikt zonder een indicatie van hun bronnaamruimte. De volgende verklaring gebruikt de varInt van de NA-naamruimte. De globale en NA gecombineerde naamruimteregio strekt zich uit tot in de fn() functie naamruimte. Dus de varInt van de eerste uitspraak in de fn() functiebereik, is van de NA-naamruimte.

Aangezien de regio voor de globale en NA-naamruimten zich over de hele fn() bereik, na de “int mijnVar2 = NB::func();,” elke naam uit de NB-naamruimte kan alleen worden gebruikt in de fn() bereik zonder het vooraf te gaan met “NB::,” alleen als het niet voorkwam in de NA en globale naamruimten (blokken). Anders moet het worden voorafgegaan door "NB::.De regio van de gecombineerde naamruimten voor NA en globaal gaat verder onder de fn() definitie en in de hoofd() functie tot het einde van het bestand.

De extensie van de NB-naamruimte begint vanaf “int mijnVar2 = NB::func();" in de fn() blok en eindigt aan het einde van de fn() definitie blok.

Opmerking: Naamruimten waarvan de regio's zijn samengevoegd, mogen niet dezelfde variabelenaam hebben in hun verschillende naamruimteblokken, omdat dit nog steeds conflicten zou veroorzaken.

Naamruimteregio's

Een naamruimte is een bereik. Afgezien van de globale naamruimte (globaal bereik), moet elke naamruimte in een blok worden gedeclareerd. Dat blok is het eerste deel van de mogelijk gedistribueerde regio's van de naamruimte. Met de gebruiksrichtlijn kan de naamruimte worden uitgebreid als regio's in andere bereiken.

Entiteiten die in een naamruimte zijn gedeclareerd, zijn naar verluidt leden van de naamruimte, en namen die door deze declaraties in het declaratieve gebied van de naamruimte worden geïntroduceerd, zijn naar verluidt lidnamen van de naamruimte.

Geneste naamruimten

Het volgende programma toont geneste naamruimten:

#include
namespace std; gebruiken;
naamruimte A

int ik = 1;
naamruimte B

int i = 2;
naamruimte C

int i = 3;



int hoofd()

cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
retourneer 0;

De uitvoer is:

1 2 3

Merk op dat de drie waarden zijn benaderd met behulp van de operator scope resolutie.

Standaard naamruimte

C++ heeft een bibliotheek die de standaardbibliotheek wordt genoemd. De namen van objecten, functies en andere entiteiten in deze bibliotheek komen uit een naamruimte die de standaardnaamruimte wordt genoemd, geschreven als soa. De standaardbibliotheek bevat subbibliotheken en een van deze subbibliotheken is iostream. De iostream bibliotheek bevat het object cout, die wordt gebruikt om resultaten naar de console (terminal) te sturen.

De naam cout moet in de soa naamruimte. Gebruiken iostream met zijn soa namespace, het programma zou als volgt moeten zijn:

#include
namespace std; gebruiken;

Let op het gebruik van de gebruik makend van richtlijn en soa. De voorwaarde "#include ” is een preprocessor-richtlijn en eindigt niet met een puntkomma. Het bevat het iostream "bestand" op de positie van zijn richtlijn.

Conclusie

Een naamruimte is een bereik. De naamruimtebeschrijving (definitie) bevat basisdeclaraties en/of definities van C++-objecten, -functies en andere entiteiten. Buiten de naamruimtedefinitie is de naam toegankelijk met de syntaxis, "naamruimteNaam::naam.” Afgezien van de globale naamruimte (globaal bereik), moet elke naamruimte in een blok worden gedeclareerd. Dat blok is het eerste deel van de mogelijk gedistribueerde regio's van de naamruimte. Met de gebruik makend van richtlijn, kan de naamruimte worden uitgebreid als regio's in andere scopes. Naamruimten waarvan de regio's zijn samengevoegd, mogen niet dezelfde variabelenaam hebben in hun verschillende naamruimteblokken, omdat dit nog steeds een naamconflict zou veroorzaken.

Chrys

Vulkan voor Linux-gebruikers
Met elke nieuwe generatie grafische kaarten zien we game-ontwikkelaars de grenzen van grafische betrouwbaarheid verleggen en een stap dichter bij foto...
OpenTTD versus Simutrans
Je eigen transportsimulatie maken kan leuk, ontspannend en buitengewoon aanlokkelijk zijn. Daarom moet je ervoor zorgen dat je zoveel mogelijk spellen...
OpenTTD-zelfstudie
OpenTTD is een van de meest populaire simulatiegames voor bedrijven die er zijn. In dit spel moet je een geweldig transportbedrijf creëren. U begint e...