Namensbereiche

Ein Namensbereich (engl. namespace) ist ein Mechanismus zum Gruppieren logisch zusammengehöriger Deklarationen. Diese Technik wird vorwiegend bei größeren Projekten eingesetzt, bei denen durch Namensbereiche repräsentierte Module oft Hunderte von Funktionen, Klassen und Templates beinhalten.

Ein Namensbereich ist ein Gültigkeitsbereich für Namen. In verschiedenen Namensbereichen können gleiche Namen verwendet werden, ohne dass es zu Verwechslungen kommt. Die üblichen Regeln für Gültigkeitsbereiche treffen auch für Namensbereiche zu.

Beispiel:

#include <iostream>
#include <string>

namespace name1
{
    double f();
    int g(int i);
}

namespace name2
{
    void h(std::string s);
    int number;
}

double name1::f() { /*...*/ }
int name1::g(int i) { /*...*/ }

void name2::h(std::string s)
{
    std::cout << s << name1::f() << " "
          << name1::g(number) << std::endl;
{}

Anmerkungen:

Der Sinn von Namensbereichen ist an dieser Stelle vielleicht nicht ersichtlich, aber, wenn man sich ein großes Projekt mit vielen Hunderten von Klassen und Funktionen vorstellt, wird einem schnell klar, dass durch Namensbereiche Namenskollisionen vermieden werden, die gerade bei großen Projekten nur schwer zu finden sind.

Wird ein Name häufig außerhalb seines Namensbereichs benutzt, wird es schnell lästig und auch unübersichtlich, ihn immer wieder zu qualifizieren. Dies kann mit Hilfe der using-Deklaration vermieden werden, die ein lokales Synonym erzeugt. Es können auch alle Namen eines Namensbereichs mit der using-Direktive verfügbar gemacht werden. Man betrachte für die beiden Varianten von using folgendes Beispiel:

#include <iostream>
#include <string>

using namespace std;  // using Direktive

namespace name1
{
    double f();
    int g(int i);
}

namespace name2
{
    void h(string s);
    int number;
    using name1::f;  // using Deklaration
}

double name1::f() { /*...*/ }
int name1::g(int i) { /*...*/ }

void name2::h(string s)
{
    using name1::g;  // using Deklaration
    cout << s << f() << " " << g(number) << endl;
}

Anmerkungen: