C++ namespaces

Namespaces zie je terug in diverse programmeertalen en ook in bv. XML. Met een namespace definieer je een context waarbinnen je zelf namen kunt verzinnen voor al je variabelen, classes, functies en andere constructies zonder erover na te denken of die namen al in een andere context bestaan. Je kunt op die manier zonder probleem namen van bekende constructies of bv. functies die in een meegelinkte library voorkomen opnieuw gebruiken zonder dat ze elkaar in de weg zitten.

Een namespace maken

Een namespace maak je met het C++ keyword namespace. De naam verzin je zelf. De namespace geldt voor het erna volgende blok code. Alle constructies daarbinnen behoren tot jouw namespace zoals in dit voorbeeld:

namespace mynamespace
{
  long a;
  double b;
}

Om te voorkomen dat jouw namespace overlapt met die van andere programmeurs kun je bijvoorbeeld een combinatie van je naam en project of zelfs geboortedatum gebruiken.

Items binnen een namespace aanwijzen

Elementen binnen jouw namespace kun je buiten die namespace aanwijzen met de scope operator :: dus de variabelen uit het vorige voorbeeld wijs je aan als
mynamespace::a
mynamespace::b

using namespace

Als je namespace veel items bevat of je wilt die op veel plaatsen gebruiken dan bestaat de kans dat je programma meer dubbele punten bevat dan leesbare tekst. Dan wordt het tijd voor de "using" operator. Daarmee geef je aan dat alle items uit een bepaalde namespace worden toegevoegd aan de globale scope.

Voor het bovenstaande voorbeeld zou je dan schrijven
using namespace mynamespace;
waarmee variabelen a en b gewoon zonder scope operator gebruikt kunnen worden.

using namespace::item

Je kunt ook een enkel item uit een namespace toegankelijk maken vanuit de globale namespace, zoals bijvoorbeeld
using mynamespace::a;

Namespace std

Alles in de standaard bibliotheek is gedefinieerd in de namespace std.
Voorbeeld:
namespace

Nested namespaces

namespace A
{
  namespace B
  {
    namespace C
    {
    }
  }
}


Nieuwe schrijfwijze vanaf C++17 

namespace A::B::C
{
}