Vegye figyelembe a következő két skaláris állítást globális körben, a következő programban:
#includenévtér használata std;
int varId = 5;
floT varId = 2.3;
int main ()
visszatér 0;
A program fordítási kísérlete fordítási hibához vezet. Két azonos nevű változó létezik, varId. Bár két különböző változó, két különböző típus, int és úszó, a fordító elutasítja a két deklarációt, mert ugyanazon a néven vannak. A következő program megoldja ezt a problémát az azonos nevű változók két különböző általánosított körben történő deklarálásával:
#includenévtér használata std;
névtér NA
int varId = 5;
névtér NB
float varId = 2.3;
int main ()
cout << NA::varId << '\n';
cout << NB::varId << '\n';
visszatér 0;
A kimenet a következő:
52.3
Két névtér van a fenti programban: NA, amelynek meghatározása egész szám, és NB, amely megadja az úszó definícióját, de ugyanazzal a névvel rendelkezik, mint az NA egész száma. Végül a program futtatásakor két különböző változó azonos nevét használták. Vegye figyelembe, hogy két különböző változó azonos nevéhez való hozzáféréshez a névtér adott nevét kell használni, amelyet a közös azonosító követ. A névtér nevét és a közös azonosítót a hatókörfeloldás operátor választja el,::.”A névterek neve megkülönbözteti az objektumokat.
Ez a cikk a névtér alapkoncepciójával és annak használatával foglalkozik a C ++ programozási nyelven. A cikk követéséhez alapvető ismeretekkel kell rendelkeznie a C ++ nyelvről. Tudnia kell a C ++ hatóköréről is, bár ezt a cikk röviden ismerteti. Ha többet szeretne megtudni a C ++ hatóköréről, keresse meg a „Scope in C ++” kifejezést (idézőjelek nélkül) bármely linuxhint keresőmezőjében.com weboldal és nyomja meg az Enter billentyűt. Ez eljut a cikk írásához, amelyet a szerző írt.
A cikk tartalma
- Mi a névtér?
- A használó irányelv
- Beágyazott névterek
- Normál névtér
- Következtetés
Mi a névtér?
A deklaratív régió a program legnagyobb része, amelyben egy entitás (változó) neve érvényes. Ezt a régiót hatókörnek nevezzük. A C ++ névtér egy általánosított hatókör, amelynek fő célja a névütközések megoldása. A névtér alapvető deklarációkkal és / vagy entitások definíciókkal rendelkezik.
Globális névtér és problémája
A globális névtér a globális hatókör. Fontolja meg a következő rövid programot:
#includenévtér használata std;
int azonos = 55;
úszó azonosító = 12.17;
int main ()
visszatér 0;
A fenti programban két változó létezik, mindkettőt hívják azonosító. Ezek a változók globális hatókörben vannak; vagyis a globális névtérben vannak. A program fordítási kísérlete hibaüzenettel nem sikerül. A globális hatókör nem fogad el egynél több azonos nevű változót, ezért szükség van egy egyedi névtérre.
Egyéni névtér
A névtérnek nem csak egy neve van. Ehelyett egy névtérnek van egy névkészlete, hogy elkerülje az ütközést más névsorokkal. A kód alacsonyabb ütközésének elkerülése érdekében minden név elé írja be a névtér nevét és :: . A következő program ezt két egyedi névtér használatával szemlélteti:
#includenévtér használata std;
névtér NA
int varInt = 6;
úszó flt;
névtér NB
int varInt = 7;
úszó flt;
int main ()
cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA :: flt = 2.5;
NB :: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
visszatér 0;
A kimenet:
67
2.5
4.8
Vegye figyelembe, hogy a nevek NA :: flt és NB :: flt végső soron a fő() funkció. A C ++ nem engedélyezi az ilyen meghatározást globális hatókörben.
Vegye figyelembe, hogy az egyéni névtér a globális névtér beágyazott névtere.
A használó irányelv
Annak elkerülése érdekében, hogy a névtér deklarálása után csak a „név” helyett írja be a „namepace :: name” szót, használhatja a felhasználásával irányelv. A szintaxis a felhasználásával irányelv a következő:
névtér használata Névtér_név;A felhasználásával direktíva nem előfeldolgozó irányelv, ezért pontosvesszővel (;) végződik.
A következő program szemlélteti a felhasználásával irányelv és még sok más:
#includenévtér használata std;
névtér NB
int varInt = 7;
int func ()
return varInt;
int fn ()
névtér használata NB;
int myVar2 = func ();
// az NB egyéb objektumai és funkciói következnek.
return myVar2;
int myVar3 = NB :: func ();
int main ()
cout << fn() << " << myVar3 << '\n';
visszatér 0;
Ennek a programnak a kimenete az 7 7. A „névtér használata NB;”Elejére került fn () meghatározás. A func () az NB névtérből éppen ezt hívják, anélkül, hogy „NB ::.”
A globális hatókörben deklarált változó (globális névtér) a deklaráció pontjától a fájl végéig látható. A beágyazott névterekben (beágyazott hatókörökben) is látható, például a beágyazottaknál fn () függvény hatóköre fent. A felhasználásával Az irányelv abból a pozícióból csatlakozik névteréhez, amelybe kerül, és annak a körnek a végéig, amelybe tartozik.
A név func () az NB névtérből nem látható a fn () definíció, mertnévtér használata NB; ” a függvény hatókörébe került (blokk). Ebben az esetben a „func ()”Az NB névtér-blokkon (hatókörön kívül) megelőzve a„NB ::,”, Mint a következő nyilatkozatban:
int myVar3 = NB :: func ();A felhasználásával A direktíva a külső fészkelő névtérrel összekapcsolja a névterét attól a helytől, ahol elhelyezi, a külső fészkelő névtér végéig. A következő programban az NA névtér össze van kapcsolva a globális névtérrel. Ezután mindkét névtér kiterjed a fn () függvénydefiníciós névtér, amelyben össze vannak kapcsolva az NB névtérrel. Az NB névtér a fn () a funkció meghatározása, és a két előző névtér a fájl végéig folytatódik (a kód végigolvasása).
#includenévtér használata std;
névtér NA
int varInt = 6;
int func ()
return varInt;
névtér NB
int varInt = 7;
int func ()
return varInt;
névtér használata NA;
int myVar0 = varInt;
// a :: és az NB egyéb objektumai és funkciói következnek.
int fn ()
int myVar1 = varInt;
névtér használata NB;
int myVar2 = NB :: func ();
// az NB-től származó egyéb objektumok és funkciók következnek ennek a hatókörnek a végéig.
adja vissza myVar1 + myVar2;
// Csak a :: és az NB objektumai és funkciói következnek.
int myVar3 = NB :: func ();
int main ()
cout << myVar0 << " << fn() << " << myVar3 << '\n';
visszatér 0;
A kimenet az 6, 13, 7.
Jegyzet: A globális névteret a :: , ami azt jelenti, hogy a hatókörfeloldás operátor előtt nincs semmi, ami következik.
A nyilatkozat alatt a „névtér használata NA;”A globális és az NA névtér változói felhasználhatók a forrás névtér megjelölése nélkül. A következő állítás a varInt az NA névtér. A globális és az NA együttes névtér-régió kiterjed a fn () függvény névtér. Így a varInt első állításának fn () függvény hatóköre, az NA névtér.
Mivel a globális és az NA névtér régiója az egész fn () hatálya után a „int myVar2 = NB :: func ();,”Az NB névtérből származó bármely név csak a fn () hatályát anélkül, hogy aNB ::,”Csak akkor, ha nem az NA-ban és a globális névtérben (blokkok) fordult elő. Ellenkező esetben a „NB ::.Az NA és a globális névtér együttes régiója a fn () definícióba és az fő() funkció a fájl végéig.
Az NB névtér kiterjesztése "int myVar2 = NB :: func ();" ban,-ben fn () blokk és a végén a fn () definíció blokk.
Jegyzet: Azok a névterek, amelyeknek a régiói össze vannak kapcsolva, nem rendelkezhetnek ugyanazzal a változóval a különböző névtér-blokkokban, mert ez továbbra is konfliktust okoz.
Névtér régiók
A névtér egy hatókör. A globális névtéren (globális hatókör) kívül minden névteret blokkban kell deklarálni. Ez a blokk a névtér esetlegesen elosztott régióinak első része. A using direktívával a névtér régióként bővíthető más hatókörökben.
A névtér törzsében deklarált entitásokról azt mondják, hogy tagjai a névtérnek, és az ezen deklarációk által a névtér deklaratív régiójába bevezetett nevek a névtér tagneveinek.
Beágyazott névterek
A következő program beágyazott névtereket mutat:
#includenévtér használata std;
névtér A
int i = 1;
névtér B
int i = 2;
névtér C
int i = 3;
int main ()
cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
visszatér 0;
A kimenet:
1 2 3Figyelje meg, hogy a három érték elérése a hatókör-felbontás operátorral történt.
Normál névtér
A C ++ rendelkezik egy standard könyvtár nevű könyvtárral. A könyvtárban található objektumok, függvények és egyéb entitások neve egy névtérből nevezett névtérből származik std. A standard könyvtár tartalmaz alkönyvtárakat, és ezek egyike iostream. A iostream könyvtár tartalmazza az objektumot cout, amelyet az eredmények elküldésére használnak a konzolra (terminálra).
A név cout kell lennie a std névtér. Használni iostream azzal std névtér, a programnak a következőnek kell lennie:
#includenévtér használata std;
Vegye figyelembe a felhasználásával irányelv és std. A „#include
Következtetés
A névtér egy hatókör. A névtér leírása (definíció) a C ++ objektumok, függvények és más entitások alapvető deklarációit és / vagy definícióit tartalmazza. A névtér meghatározásán kívül a név a szintaxissal érhető el:namespaceName :: név.”A globális névtéren (globális hatókör) kívül minden névteret blokkban kell deklarálni. Ez a blokk a névtér esetlegesen elosztott régióinak első része. A ... val felhasználásával irányelvben a névtér kiterjeszthető régióként más hatókörökben. Azok a névterek, amelyeknek a régiói össze vannak kapcsolva, nem rendelkezhetnek ugyanazzal a változóval a különböző névtér-blokkokban, mert ez még mindig névütközést okozna.
Chrys