Namensräume
Willemers Informatik-Ecke
Da nicht auszuschließen ist, dass zwei unabhängig voneinander entstandene Quelltexte die gleichen Namen verwenden, wurde in C++ der Namensraum eingeführt. Damit können Deklarationen und Definitionen unter einem Namen zusammengefasst und gegen andere Namen abgegrenzt werden.

Definition eines Namensraums

Syntax

Um einen Codebereich unter einen Namensraum zu stellen, verwenden Sie das Schlüsselwort namespace, gefolgt von dem Namen, und schließen den Code in geschweiften Klammen ein. Das folgende Beispiel könnte in einer Datei util.cpp stehen.

[Code im Namensraum util]

namespace util
{

   int zaehler;

   void sucheAnfang(string s)
   {
       ...
   }

}

Innerhalb des Namensraums ändert sich für den Programmierer nichts. Die Funktion sucheAnfang() kann die globale Variable zaehler direkt ansprechen.

Prototypen

Da die Funktionen und Variablen in einem Namensraum stehen, müssen auch die Prototypen so deklariert werden. In der passenden Header-Datei util.h würde dann beispielsweise Folgendes stehen:

[Prototypen im Namensraum util]

namespace util
{
   int zaehler;
   void sucheAnfang(string s);
   int sucheEnde(string s);
}

Einzelfunktion

Die Funktion sucheEnde() wurde nicht in der Datei util.cpp definiert. Wenn sie an anderer Stelle implementiert wird, kann der zugehörige Namensraum auch so gekennzeichnet werden, wie es bei Elementfunktionen von Klassen gemacht wird.

[Funktion für den Namensraum util]

int util::sucheEnde(string s)
{
    ...
}

Zugriff

Sollen Funktionen und Variablen aus dem Namensraum util von außerhalb aufgerufen werden, muss vor jedes Element util:: gestellt werden.

[Zugriff auf den Namensraum]

insgesamt = util::sucheEnde(Dateiname);
insgesamt += util::zaehler + datei::zaehler;

In der ersten Zeile wird die Funktion sucheEnde() aus dem Namensraum util aufgerufen. Das Ergebnis wird in einer lokalen Variable namens insgesamt gespeichert. Die zweite Zeile zeigt, wie auf gleichnamige Variablen zweier Namensräume zugegriffen wird.

Besondere Namensräume

Namensraum std

Die C++-Standardbibliotheken verwenden für alle Funktionen und Variablen den Namensraum std. Bei Verwendung von Typen, Funktionen oder Variablen aus den Standardbibliotheken müssten Sie jeweils std:: voranstellen. Sie können aber auch mit dem Befehl using erklären, dass Sie den Namensraum std verwenden wollen, als seien alle darin definierten Variablen und Funktionen ohne Namensraum definiert. Die Anweisung dazu lautet:

using namespace std;

Aliasnamen für Namensräume

Die als Beispiel verwendeten Namen util oder datei sind nicht besonders originell. Da die Namensräume gerade dazu gedacht sind, gleiche Namen verschiedener Module konfliktfrei verwenden zu können, wäre es fatal, wenn der Name des Namensraums mit einem anderen übereinstimmt. Aus diesem Grund sollten Sie einen möglichst aussagekräftigen und eindeutigen Namen verwenden. Der Nachteil ist, dass dieser vielleicht recht lange Name bei jedem Aufruf eingetippt werden muss. Das können Sie vermeiden, indem Sie vor dem Aufruf einen Alias deklarieren:

namespace datei=KundenKonfigurationsdatei;

Anonyme Namensräume

Statt statische Funktion

Namensräume können dazu verwendet werden, Namen, die für lokale Funktionen verwendet werden, vor anderen Modulen zu verbergen. In C und C++ können traditionsgemäß auch andere Module auf einen Funktionsnamen zugreifen, sofern die Funktion nicht als static definiert wird. Anstatt jede einzelne Funktion als static zu definieren, können auch mehrere Funktionen in einen Namensraum gelegt werden. Da dieser Namensraum von außen gar nicht erreichbar sein soll, kann er ohne einen Namen verwendet werden. Dadurch können alle Funktionen innerhalb der gleichen Quelltextdatei direkt auf die Elemente des Namensraums zugreifen. Nach außen sind anonyme Namensräume allerdings unsichtbar.

[Anonymer Namensraum (namespace/util.cpp)]

#include "util.h"
#include <iostream>
using namespace std;
namespace
{
    int kleinerHelfer(int a)
    {
        cout << "kleinerHelfer" << a << endl;
    }
} // namespace

void util::service()
{
    kleinerHelfer(12);
}

Die passende Header-Datei namens util.h enthält nur den Namensraum util und die darin erreichbare Funktion service().

[Header-Datei (namespace/util.h)]

namespace util
{
   void service();
}

Der Aufruf erfolgt, wie bereits gesehen, durch das Voranstellen des Namens util und zweier Doppelpunkte.

[Aufruf (namespace/main.cpp)]

#include "util.h"
int main()
{
    util::service();
}

Syntaxgraph

Der in Abbildung (grafnamespace) dargestellte Syntaxgraph zeigt die Definition eines Namensraums.

Hier steht im Buch die Abbildung "Syntaxgraph für namespace" (grafnamespace)