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)