C ++ Prostor imena

C Namespace



Prostor imena u C ++ je generalizirani opseg. Njegova deklaracija počinje rezerviranom riječju, imenskim prostorom, nakon čega slijedi ime po izboru programera, a zatim blok u zagradama. Blok sadrži osnovne deklaracije i/ili definicije C ++ objekata, funkcija i drugih entiteta.

Razmotrite sljedeće dvije skalarne izjave u globalnom opsegu, u sljedećem programu:







#uključi
koristeći imenski prostor std;

intvarId= 5;
plutativarId= 2.3;

intglavni()
{

povratak 0;
}

Pokušaj sastavljanja ovog programa dovodi do pogreške pri kompilaciji. Postoje dvije varijable s istim imenom, varId . Iako se radi o dvije različite varijable dva različita tipa, int i plutati , prevoditelj odbacuje dvije deklaracije jer su istog imena. Sljedeći program rješava ovaj problem deklaracijom varijabli s istim imenom u dva različita generalizirana područja:



#uključi
koristeći imenski prostor std;

imenski prostor NA
{
intvarId= 5;
}

imenski prostor NB
{
plutativarId= 2.3;
}

intglavni()
{
trošak<<NA::varId << ' n';
trošak<<Napomena:::varId << ' n';

povratak 0;
}

Izlaz je sljedeći:



5
2.3

U gornjem programu postoje dva imenska prostora: NA , koji ima definiciju cijelog broja, i Napomena: , koji ima definiciju float -a, ali s istim imenom kao i cijeli broj za NA. Konačno, pri pokretanju programa korišten je isti naziv za dvije različite varijable. Imajte na umu da se za pristup istom imenu dviju različitih varijabli mora koristiti određeni naziv za imenski prostor, a zatim zajednički identifikator. Naziv prostora imena i zajednički identifikator odvojeni su operatorom razrješenja opsega, :: . Nazivi imenskih prostora razlikovat će objekte.





Ovaj članak pokriva osnovni koncept prostora imena i njegovu upotrebu u programskom jeziku C ++. Da biste pratili ovaj članak, trebali biste imati osnovno znanje jezika C ++. Također biste trebali znati opseg C ++, iako je to ukratko objašnjeno u ovom članku. Da biste saznali više o opsegu C ++, potražite izraz, Opseg u C ++ (bez navodnika) u okviru za pretraživanje bilo koje web stranice linuxhint.com i pritisnite Enter. Ovo će vas odvesti do članka koji je ovaj autor napisao.

Sadržaj članka

Što je prostor imena?

Deklarativna regija najveći je dio programa u kojem je naziv entiteta (varijabla) ispravan. Ovo se područje naziva opsegom. Prostor imena u C ++ je generalizirani opseg čija je glavna svrha rješavanje sukoba imena. Prostor imena ima osnovne deklaracije i/ili definicije entiteta.



Globalni imenski prostor i njegov problem

Globalni imenski prostor je globalni opseg. Razmotrite sljedeći kratki program:

#uključi
koristeći imenski prostor std;

intident= 55;
plutatiident= 12.17;

intglavni()
{

povratak 0;
}

U gornjem programu postoje dvije varijable, obje se nazivaju ident . Ove su varijable u globalnom opsegu; odnosno nalaze se u globalnom imenskom prostoru. Pokušaj sastavljanja ovog programa neće uspjeti s porukom o pogrešci. Globalni opseg ne prihvaća više od jedne varijable s istim imenom, pa postoji potreba za prilagođenim prostorom imena.

Prilagođeni prostor imena

Prostor imena nema samo jedno ime. Umjesto toga, imenski prostor ima skup imena kako bi se izbjegao sukob s drugim skupovima imena. Da biste izbjegli sukob niže u kodu, ispred svakog imena unesite naziv imenskog prostora i :: . Sljedeći program to ilustrira pomoću dva prilagođena prostora imena:

#uključi
koristeći imenski prostor std;

imenski prostor NA
{
intvarijanta= 6;
plutatiflt;
}

imenski prostor NB
{
intvarijanta= 7;
plutatiflt;
}

intglavni()
{
trošak<<NA::varijanta << ' n';
trošak<<Napomena:::varijanta << ' n';
NA::flt = 2.5;
Napomena:::flt = 4.8;
trošak<<NA::flt << ' n';
trošak<<Napomena:::flt << ' n';

povratak 0;
}

Izlaz je:

6
7
2.5
4.8

Imajte na umu da su imena NA :: flt i Napomena: ft su konačno definirane u glavni() funkcija. C ++ ne dopušta takvu definiciju u globalnom opsegu.

Imajte na umu da je prilagođeni imenski prostor ugniježđeni imenski prostor za globalni imenski prostor.

Direktiva o korištenju

Da biste izbjegli upisivanje imenskog prostora :: ime cijelo vrijeme umjesto samo imena nakon deklariranja imenskog prostora, možete koristiti koristeći direktiva. Sintaksa za korištenje koristeći direktiva je sljedeća:

koristeći imenski prostor Namespace_name;

The koristeći direktiva nije predprocesorska direktiva pa završava točkom -zarezom (;).

Sljedeći program ilustrira upotrebu koristeći direktiva i više:

#uključi
koristeći imenski prostor std;

imenski prostor NB
{
intvarijanta= 7;
intfunkcija()
{
povratakvarijanta;
}
}

intfn()
{
koristeći imenski prostor NB;
intmyVar2=funkcija();
// slijede drugi objekti i funkcije iz NB.
povratakmyVar2;
}

intmyVar3=Napomena:::funkcija();

intglavni()
{
trošak<<fn() << '' <<myVar3<< ' n';

povratak 0;
}

Ishod ovog programa je 7 7 . Uvjet pomoću prostora imena NB; stavljen je na početak fn () definicija. The func () iz NB imenskog prostora naziva se odmah ispod toga, bez prethodnika s Napomena: .

Varijabla deklarirana u globalnom opsegu (globalni imenski prostor) gleda se od točke deklaracije do kraja datoteke. Također se vidi u ugniježđenim imenskim prostorima (ugniježđenim opsezima), poput ugniježđenih fn () opseg funkcije iznad. The koristeći direktiva pridružuje svoj imenski prostor od mjesta na kojem je postavljena do kraja opsega u kojem je postavljena.

Ime func () iz prostora imena NB ne može se vidjeti ispod fn () definicija jer pomoću prostora imena NB; stavljen je u opseg funkcije (blok). Pod ovim uvjetom, koristiti func () izvan bloka imenskog prostora NB (opseg), mora mu prethoditi Napomena: , kao u sljedećoj izjavi:

intmyVar3=Napomena:::funkcija();

The koristeći direktiva spaja svoj imenski prostor s vanjskim ugniježđenim imenskim prostorom od mjesta na kojem je postavljena do kraja vanjskog gniježdenog imenskog prostora. U sljedećem programu nazivni prostor NA spojen je s globalnim imenskim prostorom. Oba se imenska prostora zatim proširuju u fn () imenski prostor definicije funkcije, u kojem su spojeni s imenskim prostorom NB. Prostor imena NB završava na kraju fn () definicije funkcije, a dva prethodna imenska prostora nastavljaju se do kraja datoteke (pročitajte kôd).

#uključi
koristeći imenski prostor std;

imenski prostor NA
{
intvarijanta= 6;
intfunkcija()
{
povratakvarijanta;
}

}

imenski prostor NB
{
intvarijanta= 7;
intfunkcija()
{
povratakvarijanta;
}
}

koristeći imenski prostor NA;
intmyVar0=varijanta;
// slijede drugi objekti i funkcije iz :: i NB.

intfn()
{
intmyVar1=varijanta;
koristeći imenski prostor NB;
intmyVar2=Napomena:::funkcija();
// slijede drugi objekti i funkcije iz napomene, do kraja ovog opsega.
povratakmyVar1+myVar2;
}

// Slijede samo objekti i funkcije iz :: i NB.

intmyVar3=Napomena:::funkcija();

intglavni()
{
trošak<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

povratak 0;
}

Izlaz je 6, 13, 7 .

Bilješka: Globalni imenski prostor označen je s :: , što znači da nema ničega prije operatora razrješenja opsega koji slijedi.

Ispod izjave, pomoću prostora imena NA; varijable iz globalnog i NA imenskog prostora mogu se koristiti bez naznake njihovog izvornog imenskog prostora. Sljedeća izjava koristi varijanta prostora imena NA. Globalno i NA kombinirano područje imena proteže se u fn () imenski prostor funkcije. Dakle, varijanta prve izjave u fn () opseg funkcije, pripada prostoru naziva NA.

Budući da se regija za globalne i NA imenske prostore proteže cijelim fn () opseg, nakon int myVar2 = NB :: func (); , bilo koji naziv iz imenskog prostora NB može se koristiti samo u fn () opseg bez prethodnog stavljanja s Napomena: , samo ako se to nije dogodilo u NA i globalnim imenskim prostorima (blokovima). Inače bi mu trebalo prethoditi Napomena: . Područje kombiniranih imenskih prostora za NA i globalno nastavlja se ispod fn () definicija i u glavni() funkciju do kraja datoteke.

Proširenje prostora imena NB počinje od int myVar2 = NB :: func (); u fn () blok i završava na kraju fn () blok definicije.

Bilješka: Prostori imena čija su područja spojena ne bi smjeli imati isti naziv varijable u različitim blokovima imenskog prostora jer bi to i dalje uzrokovalo sukob.

Regije prostora imena

Prostor imena je opseg. Osim globalnog imenskog prostora (globalni opseg), bilo koji imenski prostor trebao bi biti deklariran u bloku. Taj je blok prvi dio moguće distribuiranih regija imenskog prostora. Pomoću direktive, prostor imena može se proširiti kao regije u drugim područjima.

Za entitete deklarirane u tijelu imenskog prostora kaže se da su članovi imenskog prostora, a za imena koja se ovim deklaracijama unose u deklarativno područje imenskog prostora kaže se da su imena članova imenskog prostora.

Ugniježđeni prostori imena

Sljedeći program prikazuje ugniježđene prostore imena:

#uključi
koristeći imenski prostor std;

imenski prostor A
{
inti= 1;
imenski prostor B
{
inti= 2;
imenski prostor C
{
inti= 3;
}
}
}

intglavni()
{
trošak<<DO::i << '' <<DO::B::i << '' <<DO::B::C::i << ' n';

povratak 0;
}

Izlaz je:

1 2 3

Uočite da je tri vrijednosti pristupano pomoću operatora razlučivosti opsega.

Standardni prostor imena

C ++ ima knjižnicu koja se naziva standardna knjižnica. Nazivi objekata, funkcija i drugih entiteta u ovoj knjižnici dolaze iz imenskog prostora koji se naziva standardni imenski prostor, napisan kao sati . Standardna knjižnica sadrži pod-knjižnice, a jedna od tih pod-knjižnica je iostream . The iostream knjižnica sadrži objekt trošak , koji se koristi za slanje rezultata na konzolu (terminal).

Ime trošak mora biti u sati imenski prostor. Koristiti iostream sa svojim sati imenskog prostora, program bi trebao biti sljedeći:

#uključi
koristeći imenski prostor std;

Obratite pozornost na korištenje koristeći direktivom i sati . Uvjet #uključi je predprocesorska direktiva i ne završava točkom -zarezom. Uključuje iostream datoteku na mjestu svoje direktive.

Zaključak

Prostor imena je opseg. Opis imenskog prostora (definicija) sadrži osnovne deklaracije i/ili definicije C ++ objekata, funkcija i drugih entiteta. Izvan definicije imenskog prostora, imenu se može pristupiti sintaksom, namespaceName :: name . Osim globalnog imenskog prostora (globalni opseg), bilo koji imenski prostor trebao bi biti deklariran u bloku. Taj je blok prvi dio moguće distribuiranih regija imenskog prostora. S koristeći Direktive, prostor imena može se proširiti kao regije u drugim područjima. Prostori imena čija su područja spojena ne bi smjeli imati isti naziv varijable u različitim blokovima imenskog prostora, jer bi to i dalje uzrokovalo sukob imena.

Chrys