Vaikka kaikenlaisilla etuliitteillä (mycPiste) ja muilla nimeämistempuilla saadaan periaatteessa rajaton määrä erilaisia symboleja, niin kuitenkin käytännön ohjelmissa käyttökelpoiset nimet rupeavat käymään vähiin. Normaalisti tietyssä modulissa esitellyt nimet jäävät lokaalisti tähän moduuliin, mutta kaikki globaalit nimet jakavat samaa nimiavaruutta. Tällaisiahan on esimerkiksi otsikkotiedostoissa esitellyt funktiot ja tyypit (luokat).
C++:n nimiavaruudet (namespaces) tuovat helpotusta tähän ongelmaan. Itse asiassa luokathan muodostavat tietyllä tavalla jo oman nimiavaruutensa. Seuraavassa esimerkissä kannattaa ehkä eniten kiinnittää huomiota tyypin tTyyppi käyttöön :
/* namespac.cpp */ // Esimerkki nimiavaruuksien (namespace) käytöstä /vl-96 // Vaikka esimerkissä on paljon muuttujia, niin yleensä suurin hyöty // saadaan nimiavaruukisen käytöstä tyyppien kanssa. #include <iostream.h> namespace nsOmat { // Nimiavaruuden esittely typedef char tTyyppi; // Yleensä nimenomaan tyypit aiheuttaa päällekkäis. int a = 5; int b = 6; int c = 7; namespace nsErikoiset { // Sisäkkäisetkin nimiarvaruudet on sallittu double d = 8.5; } } namespace nsVieraat { typedef double tTyyppi; char a = 'a'; char b = 'b'; char c = 'c'; } namespace nsKamalanPitkaNimiAvaruudenNimi { double a = 9.2; namespace nsJaViela { double f = 10.3; } } namespace nsOmat { // Nimiavaruuteen voi lisätä määrityksiä double e = 9.6; } namespace nsKPNAN = nsKamalanPitkaNimiAvaruudenNimi; // Namespace alias namespace nsJV = nsKPNAN::nsJaViela; // Namespace alias int main(void) { double c = 70; // Lokaali nimi voittaa aina using namespace nsOmat; using namespace nsErikoiset; cout << "d = " << d << endl; // 8.5 nsOmat::nsErikoiset::d tTyyppi d = 'x'; // nsOmat::tTyyppi cout << "a = " << a << endl; // 5 nsOmat::a cout << "b = " << b << endl; // 6 nsOmat::b cout << "c = " << c << endl; // 70 lokaali c cout << "d = " << d << endl; // x lokaali d cout << "e = " << e << endl; // 9.6 nsOmat::e cout << "b = " << nsVieraat::b << endl; // b nsVieraat::b { // Uusi vaikutusalue using nsVieraat::a; // nyt a on aina nsVieraat::a cout << "a = " << a << endl; // a nsVieraat::a } // em. vaikutusalue loppu cout << "a = " << a << endl; // 5 nsOmat::a using nsKPNAN::a; cout << "a = " << a << endl; // 9.2 nsKamalan..Nimi::a using namespace nsJV; cout << "f = " << f << endl; // 10.3 nsKam..Nimi::nsJaViela::f using nsVieraat::tTyyppi; tTyyppi f = 1.75; // nsVieraat::tTyyppi cout << "f = " << f << endl; // 1.75 lokaali f return 0; }Joskus nimiavaruuksia voidaan hyödyntää myös "siirtämällä" valmiita kirjastoja omaan nimiavaruuteensa ja näin voidaan kiertää ongelmia, jos kahdessa eri kirjastossa on määritelty samoja funktioita:
/* namespa2.cpp */ // Esimerkki nimiavaruuksien (namespace) käytöstä /vl-96 #include <iostream.h> namespace nsCIO { #include <stdio.h> } int printf(const char *s) { cout << s << flush; return 1; } int main(void) { nsCIO::printf("Kissa\n"); // Alkuperäinen printf-funktio printf("Kissa\n"); // Oma printf-funktio return 0; }