C++ namespace

Angenommen, es gibt eine Situation, in der zwei Schüler namens Zara in einer Klasse sind. Um sie eindeutig zu unterscheiden, müssen wir zusätzlich zu ihren Namen einige zusätzliche Informationen verwenden, wie ihre Wohnadressen oder die Namen ihrer Eltern und so weiter.

Dieselbe Situation tritt auch in C++-Anwendungen auf. Zum Beispiel könnten Sie eine Funktion namens xyz() schreiben, und dieselbe Funktion xyz() existiert auch in einer anderen verfügbaren Bibliothek. Auf diese Weise kann der Compiler nicht feststellen, welche xyz()-Funktion Sie verwenden.

Daher wirdnamespaceeingeführt. Dieses Konzept wird speziell verwendet, um das oben genannte Problem zu lösen. Es kann als zusätzliche Information dienen, um Funktionen, Klassen, Variablen usw. mit demselben Namen in verschiedenen Bibliotheken zu unterscheiden. Die Verwendung eines Namensraums definiert einen Kontext. Im Wesentlichen definiert ein Namensraum einen Gültigkeitsbereich.

Nehmen wir ein Beispiel aus einem Computersystem: Ein Ordner (Verzeichnis) kann mehrere Ordner enthalten. Innerhalb jedes Ordners können Dateinamen nicht gleich sein, aber Dateien in verschiedenen Ordnern können denselben Namen haben.

Definieren Sie einen Namensraum

Die Definition eines Namensraums verwendet das Schlüsselwortnamespace, gefolgt vom Namen des Namensraums, wie unten gezeigt:

namespace namespace_name { // Code-Deklaration }

Um eine Funktion oder Variable mit einem Namensraum aufzurufen, müssen Sie den Namen des Namensraums davor setzen, wie unten gezeigt:

name::code; // Code kann eine Variable oder Funktion sein

Schauen wir uns an, wie ein Namensraum einen Gültigkeitsbereich für Entitäten wie Variablen oder Funktionen definiert:

Beispiel

#include <iostream> using namespace std; // erster Namensraum namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // zweiter Namensraum namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } int main () { // Funktion im ersten Namensraum aufrufen first_space::func(); // Funktion im zweiten Namensraum aufrufen second_space::func(); return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Inside first_space
Inside second_space

using-Direktive

Sie könnenusing namespace-Direktive verwenden, sodass Sie beim Verwenden des Namensraums den Namensraum-Namen nicht voranstellen müssen. Diese Direktive teilt dem Compiler mit, dass der nachfolgende Code Namen aus dem angegebenen Namensraum verwendet.

Beispiel

#include <iostream> using namespace std; // erster Namensraum namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // zweiter Namensraum namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // Funktion im ersten Namensraum aufrufen func(); return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Inside first_space

Die using-Direktive kann auch verwendet werden, um bestimmte Elemente in einem Namensraum anzugeben. Wenn Sie beispielsweise nur den cout-Teil des std-Namensraums verwenden möchten, können Sie eine Anweisung wie die folgende verwenden:

using std::cout;

Im nachfolgenden Code müssen Sie bei der Verwendung von cout nicht den Namensraum-Namen voranstellen, aberstdandere Elemente im Namensraum müssen weiterhin mit dem Namensraum-Namen versehen werden, wie unten gezeigt:

Beispiel

#include <iostream> using std::cout; int main () { cout << "std::endl wird mit std verwendet!" << std::endl; return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

std::endl is used with std!

usingDie durch die Direktive eingeführten Namen folgen den normalen Gültigkeitsbereichsregeln. Die Namen sind von der Verwendung derusingDirektive bis zum Ende dieses Gültigkeitsbereichs sichtbar. An diesem Punkt werden Entitäten mit demselben Namen, die außerhalb des Gültigkeitsbereichs definiert sind, ausgeblendet.

Nicht zusammenhängende Namensräume

Ein Namensraum kann in mehreren verschiedenen Teilen definiert werden, daher setzt sich ein Namensraum aus mehreren separat definierten Teilen zusammen. Die verschiedenen Komponenten eines Namensraums können über mehrere Dateien verteilt sein.

Wenn daher eine Komponente eines Namensraums einen in einer anderen Datei definierten Namen anfordern muss, muss sie diesen Namen dennoch deklarieren. Die folgende Namensraumdefinition kann einen neuen Namensraum definieren oder neue Elemente zu einem vorhandenen Namensraum hinzufügen:

namespace namespace_name { // Code-Deklaration }

Verschachtelte Namensräume

Namensräume können verschachtelt werden. Sie können einen weiteren Namensraum innerhalb eines Namensraums definieren, wie unten gezeigt:

namespace namespace_name1 { // Code-Deklaration namespace namespace_name2 { // Code-Deklaration } }

Sie können::operator verwenden, um auf Mitglieder in einem verschachtelten Namensraum zuzugreifen:

// Zugriff auf Member in namespace_name2 using namespace namespace_name1::namespace_name2; // Zugriff auf Member in namespace_name1 using namespace namespace_name1;

In der obigen Anweisung, wenn namespace_name1 verwendet wird, dann sind Elemente in namespace_name2 innerhalb dieses Geltungsbereichs ebenfalls verfügbar, wie unten gezeigt:

Beispiel

#include <iostream> using namespace std; // erster Namensraum namespace first_space{ void func(){ cout << "Inside first_space" << endl; } // zweiter Namensraum namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // Aufruf der Funktion im zweiten Namespace func(); return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Inside second_space
Weitere Erweiterungen