Prev Next Up Title Contents Index

Nimiavaruus (namespace)

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;
	}


Prev Next Up Title Contents Index