C++-naamruimte

C Namespace



Een naamruimte in C++ is een gegeneraliseerd bereik. De declaratie 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:







#erbij betrekken
namespace std; gebruiken;

intvariId= 5;
vlotvariId= 2.3;

inthoofd()
{

opbrengst 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 vlot , verwerpt de compiler de twee declaraties 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:



#erbij betrekken
namespace std; gebruiken;

naamruimte NA
{
intvariId= 5;
}

naamruimte NB
{
vlotvariId= 2.3;
}

inthoofd()
{
kosten<<NA::varId << 'N';
kosten<<NB::variId << 'N';

opbrengst 0;
}

De uitvoer is als volgt:



5
2.3

Er zijn twee naamruimten in het bovenstaande programma: NA , die de definitie van een geheel getal heeft, 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 gemeenschappelijke id worden gescheiden door de scope-resolutie-operator, :: . 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. Om meer te weten te komen over het bereik van C++, zoekt u naar de zin Scope in C++ (zonder aanhalingstekens) in het zoekvak van een willekeurige linuxhint.com-webpagina en drukt u op Enter. Dit leidt u 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 scope 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:

#erbij betrekken
namespace std; gebruiken;

intident= 55;
vlotident= 12.17;

inthoofd()
{

opbrengst 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:

#erbij betrekken
namespace std; gebruiken;

naamruimte NA
{
intvarInt= 6;
vlotflt;
}

naamruimte NB
{
intvarInt= 7;
vlotflt;
}

inthoofd()
{
kosten<<NA::varInt << 'N';
kosten<<NB::varInt << 'N';
NA::flt = 2,5;
NB::flt = 4.8;
kosten<<NA::flt << 'N';
kosten<<NB::flt << 'N';

opbrengst 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.

Houd er rekening mee dat de aangepaste naamruimte een geneste naamruimte is voor de algemene naamruimte.

De gebruiksrichtlijn

Om te voorkomen dat u namepace::name de hele tijd typt in plaats van alleen naam 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:

#erbij betrekken
namespace std; gebruiken;

naamruimte NB
{
intvarInt= 7;
intfunctie()
{
opbrengstvarInt;
}
}

intfn()
{
naamruimte gebruiken NB;
intmijnVar2=functie();
//andere objecten en functies van NB volgen.
opbrengstmijnVar2;
}

intmijnVar3=NB::functie();

inthoofd()
{
kosten<<fn() << '' <<mijnVar3<< 'N';

opbrengst 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 voorafgaande met NB:: .

Een variabele gedeclareerd in het globale bereik (global namespace) 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; binnen het functiebereik (blok) is geplaatst. Onder deze voorwaarde, te gebruiken: func () buiten het NB-naamruimteblok (scope), moet het worden voorafgegaan door NB:: , zoals in de volgende verklaring:

intmijnVar3=NB::functie();

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).

#erbij betrekken
namespace std; gebruiken;

naamruimte NA
{
intvarInt= 6;
intfunctie()
{
opbrengstvarInt;
}

}

naamruimte NB
{
intvarInt= 7;
intfunctie()
{
opbrengstvarInt;
}
}

gebruik van naamruimte NA;
intmijnVar0=varInt;
//andere objecten en functies van :: en NB volgen.

intfn()
{
intmijnVar1=varInt;
naamruimte gebruiken NB;
intmijnVar2=NB::functie();
//andere objecten en functies van NB volgen tot het einde van deze scope.
opbrengstmijnVar1+mijnVar2;
}

// Alleen objecten en functies van :: en NB volgen.

intmijnVar3=NB::functie();

inthoofd()
{
kosten<<mijnVar0<< '' <<fn() << '' <<mijnVar3<< 'N';

opbrengst 0;
}

De uitvoer is: 6, 13, 7 .

Opmerking: De globale naamruimte wordt aangegeven met :: , wat betekent dat er niets is vóór de operator voor bereikresolutie die volgt.

Onder de verklaring, de gebruik van naamruimte NA; variabelen uit de globale en NA-naamruimten kunnen worden gebruikt zonder vermelding 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(); , kan elke naam uit de NB-naamruimte 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 voor conflicten zou zorgen.

Naamruimteregio's

Een naamruimte is een bereik. Afgezien van de globale naamruimte (global scope), 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 scopes.

Entiteiten die zijn gedeclareerd in een naamruimte-body worden geacht leden van de naamruimte te zijn, 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:

#erbij betrekken
namespace std; gebruiken;

naamruimte A
{
intl= 1;
naamruimte B
{
intl= 2;
naamruimte C
{
intl= 3;
}
}
}

inthoofd()
{
kosten<<TOT::l << '' <<TOT::B::l << '' <<TOT::B::C::l << 'N';

opbrengst 0;
}

De uitvoer is:

1 2 3

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

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 uur . De standaardbibliotheek bevat subbibliotheken en een van deze subbibliotheken is iostream . De iostream bibliotheek bevat het object kosten , die wordt gebruikt om resultaten naar de console (terminal) te sturen.

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

#erbij betrekken
namespace std; gebruiken;

Let op het gebruik van de gebruik makend van richtlijn en uur . De voorwaarde #erbij betrekken 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 (global scope), 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