C++ Tutorial

 Namensräume

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.

Definition

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.

Zugriff auf Namensraum

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

// 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());
}