Mithilfe von Namensräumen kann die Sichtbarkeit von Namen explizit spezifiziert werden, so dass gleichnamige Daten und Symbole nicht zu einem Übersetzungsfehler führen. Ein Namesraum, der Namensraum std der C++-Standardbibliothek, wurde in den vorherigen Kapiteln schon häufig verwendet.
Die Anweisung
namespace spaceName
{
int var;
void DoAnything() { ... };
}
definiert den Namensraum spaceNamen, welche das Datum var und die Funktion DoAnything() einschließt. D.h., nach dem Schlüsselwort namespace folgt ein frei wählbarer Name für den Namensraum und anschließend ein Paar geschweifter Klammern. Innerhalb der Klammern werden die Daten und Funktionen definiert, die in diesem Namensraum eingeschlossen werden.
Ist ein Namensraum innerhalb eines Blocks {...} definiert, ist er nur innerhalb des Blocks gültig.
Wird ein Namensraum mehrfach, aber mit unterschiedlichen Daten und Funktionen, definiert, so wird dieser entsprechend erweitert, d.h. Namensräume sind additiv.
Um auf Daten und Funktionen eines Namensraums zuzugreifen, wird der Name des Namensraums, dann zwei Doppelpunkte und anschließend das Datum bzw. die Funktion angegeben.
auto res = spaceName::var; // Datum im Namensraum spaceName
spaceName::DoAnything(); // Funktion im Namenraum spaceName
// Anwendung
#include <iostream>
#include <format>
// Daten definieren
const char* const pName = "main.cpp";
// Funktionen definieren
int CountCalls()
{
static int count = 10;
return ++count;
}
int main()
{
// Datum und Funktion der Anwendung ausgeben
for (auto index=0; index<3; index++)
std::cout << std::format("{} CountCalls() = {}\n", pName, CountCalls());
}
Desweiteren soll folgende Bibliothek bibl.cpp vorgegeben sein, die (unglücklicherweise) ebenfalls ein Datum pName und eine Funktion CountCalls() enthält.
// Datei bibl.cpp
// Simuliert eine externe Bibliothek
// Name der Bibliothek
extern const char *const pName = "bibl.cpp";
// Beliebige Bibliothektsfunktion
int CountCalls()
{
static int count = 0;
return ++count;
}
Geben Sie das Datum pName und den Returnwert der Funktion CountCalls() aus der Anwendung und der Bibliothek 3-mal aus. Die Bibliothek bibl.cpp darf dabei nicht verändert werden!
// Datei main.cpp, bibl.cpp unveraendert wie oben angegeben
// Verwendet ein Datum und ein Funktion aus
// der Bibliothek bibl.cpp
#include <iostream>
#include <format>
// extern-Verweise der Bibliothek
// In der Realitaet wuerden die Anweisung in einer
// eigenen Header-Datei (z.B. bibl.h) stehen
extern const char* const pName;
extern int CountCalls();
// Gleichnamiges Datum wie in der Bibliothek bibl.cpp
namespace cpp
{
const char* const pName = "main.cpp";
// Gleichnamige Funktion wie in der Bibliothek bibl.cpp
int CountCalls()
{
static int count = 10;
return ++count;
}
}
int main()
{
// Datum und Funktion der Anwendung ausgeben
for (auto index = 0; index < 3; index++)
std::cout << std::format("{} CountCalls() = {}\n", cpp::pName, cpp::CountCalls());
// Datum und Funktion der Bibliothek ausgeben
for (auto index = 0; index < 3; index++)
std::cout << std::format("{} CountCalls() = {}\n", pName, CountCalls());
}
main.cpp CountCalls() = 12
main.cpp CountCalls() = 13
bibl.cpp CountCalls() = 1
bibl.cpp CountCalls() = 2
bibl.cpp CountCalls() = 3