C++-Namespace

C Namespace



Ein Namespace in C++ ist ein verallgemeinerter Geltungsbereich. Seine Deklaration beginnt mit dem reservierten Wort namespace, gefolgt von einem Namen nach Wahl des Programmierers und dann dem Block in geschweiften Klammern. Der Block enthält grundlegende Deklarationen und/oder Definitionen von C++-Objekten, Funktionen und anderen Entitäten.

Betrachten Sie die folgenden zwei skalaren Anweisungen in einem globalen Gültigkeitsbereich im folgenden Programm:







#enthalten
mit namespace std;

intvarId= 5;
schwebenvarId= 2.3;

inthauptsächlich()
{

Rückkehr 0;
}

Ein Versuch, dieses Programm zu kompilieren, führt zu einem Kompilierungsfehler. Es gibt zwei Variablen mit demselben Namen, varId . Obwohl es sich um zwei verschiedene Variablen von zwei verschiedenen Typen handelt, int und schweben , lehnt der Compiler die beiden Deklarationen ab, da sie denselben Namen haben. Das folgende Programm löst dieses Problem, indem es die gleichnamigen Variablen in zwei verschiedenen generalisierten Geltungsbereichen deklariert:



#enthalten
mit namespace std;

Namensraum NA
{
intvarId= 5;
}

Namensraum NB
{
schwebenvarId= 2.3;
}

inthauptsächlich()
{
Kosten<<N / A::varId << ' ';
Kosten<<NB::varId << ' ';

Rückkehr 0;
}

Die Ausgabe ist wie folgt:



5
2.3

Im obigen Programm gibt es zwei Namensräume: N / A , die die Definition einer ganzen Zahl hat, und NB , die die Definition eines Floats hat, aber denselben Namen wie die ganze Zahl für NA hat. Schließlich wurde beim Ausführen des Programms derselbe Name für zwei verschiedene Variablen verwendet. Beachten Sie, dass für den Zugriff auf denselben Namen zweier verschiedener Variablen der jeweilige Name für den Namespace verwendet werden muss, gefolgt vom gemeinsamen Bezeichner. Der Namespace-Name und der allgemeine Bezeichner werden durch den Bereichsauflösungsoperator getrennt, :: . Die Namen der Namensräume werden die Objekte unterscheiden.





Dieser Artikel behandelt das grundlegende Konzept eines Namespace und seine Verwendung in der Programmiersprache C++. Um diesem Artikel folgen zu können, sollten Sie über Grundkenntnisse der Sprache C++ verfügen. Sie sollten auch über Kenntnisse des C++-Bereichs verfügen, obwohl er in diesem Artikel kurz erläutert wird. Um mehr über den Geltungsbereich von C++ zu erfahren, suchen Sie im Suchfeld einer beliebigen linuxhint.com-Webseite nach dem Ausdruck Geltungsbereich in C++ (ohne Anführungszeichen) und drücken Sie die Eingabetaste. Dies führt Sie zu dem Artikel, den dieser Autor geschrieben hat.

Artikelinhalt

Was ist ein Namensraum?

Eine deklarative Region ist der größte Teil eines Programms, in dem der Name einer Entität (Variable) gültig ist. Dieser Bereich wird als Bereich bezeichnet. Ein Namespace in C++ ist ein verallgemeinerter Geltungsbereich, dessen Hauptzweck darin besteht, Namenskonflikte zu lösen. Ein Namespace hat grundlegende Deklarationen und/oder Definitionen von Entitäten.



Globaler Namensraum und sein Problem

Der globale Namespace ist der globale Geltungsbereich. Betrachten Sie das folgende kurze Programm:

#enthalten
mit namespace std;

intident= 55;
schwebenident= 12.17;

inthauptsächlich()
{

Rückkehr 0;
}

Im obigen Programm gibt es zwei Variablen, die beide genannt werden ident . Diese Variablen befinden sich im globalen Gültigkeitsbereich; das heißt, sie befinden sich im globalen Namespace. Ein Versuch, dieses Programm zu kompilieren, schlägt mit einer Fehlermeldung fehl. Der globale Gültigkeitsbereich akzeptiert nicht mehr als eine Variable mit demselben Namen, daher ist ein benutzerdefinierter Namespace erforderlich.

Benutzerdefinierter Namensraum

Ein Namespace hat nicht nur einen Namen. Stattdessen verfügt ein Namespace über eine Reihe von Namen, um Konflikte mit anderen Namensgruppen zu vermeiden. Um Konflikte weiter unten im Code zu vermeiden, stellen Sie vor jedem Namen den Namen des Namensraums und :: . Das folgende Programm veranschaulicht dies anhand von zwei benutzerdefinierten Namespaces:

#enthalten
mit namespace std;

Namensraum NA
{
intvarInt= 6;
schwebenflt;
}

Namensraum NB
{
intvarInt= 7;
schwebenflt;
}

inthauptsächlich()
{
Kosten<<N / A::varInt << ' ';
Kosten<<NB::varInt << ' ';
N / A::flt = 2.5;
NB::flt = 4.8;
Kosten<<N / A::flt << ' ';
Kosten<<NB::flt << ' ';

Rückkehr 0;
}

Die Ausgabe ist:

6
7
2.5
4.8

Beachten Sie, dass die Namen NA::flt und Hinweis::flt wurden schließlich in der hauptsächlich() Funktion. C++ lässt eine solche Definition im globalen Geltungsbereich nicht zu.

Beachten Sie, dass der benutzerdefinierte Namespace ein geschachtelter Namespace für den globalen Namespace ist.

Die Nutzungsrichtlinie

Um zu vermeiden, dass namespace::name ständig eingegeben wird, anstatt nur name, nachdem der Namespace deklariert wurde, können Sie die mit Richtlinie. Die Syntax zur Verwendung der mit Richtlinie lautet wie folgt:

Namespace verwenden Namespace_name;

Die mit Die Direktive ist keine Präprozessordirektive, daher endet sie mit einem Semikolon (;).

Das folgende Programm veranschaulicht die Verwendung der mit Richtlinie und mehr:

#enthalten
mit namespace std;

Namensraum NB
{
intvarInt= 7;
intFunktion()
{
RückkehrvarInt;
}
}

intfn()
{
Namensraum verwenden NB;
intmyVar2=Funktion();
//weitere Objekte und Funktionen von NB folgen.
RückkehrmyVar2;
}

intmyVar3=NB::Funktion();

inthauptsächlich()
{
Kosten<<fn() << '' <<myVar3<< ' ';

Rückkehr 0;
}

Die Ausgabe dieses Programms ist 7 7 . Der Begriff Namensraum verwenden NB; wurde am Anfang des fn() Definition. Die Funktion () aus dem NB-Namensraum wird direkt darunter aufgerufen, ohne mit voranzustellen Hinweis:: .

Eine im globalen Geltungsbereich (globaler Namensraum) deklarierte Variable wird vom Deklarationspunkt bis zum Ende der Datei betrachtet. Es wird auch in den verschachtelten Namespaces (nested Scopes) angezeigt, wie z fn() Funktionsumfang oben. Die mit Die Direktive verbindet ihren Namensraum von der Position, an der sie platziert wurde, bis zum Ende des Gültigkeitsbereichs, in dem sie platziert wurde.

Der Name Funktion () aus dem NB-Namensraum nicht unter dem fn() Definition weil Namensraum verwenden NB; wurde in den Funktionsumfang (Block) gelegt. Unter dieser Bedingung zu verwenden Funktion () außerhalb des NB-Namespace-Blocks (Scope) muss vorangestellt werden Hinweis:: , wie in der folgenden Aussage:

intmyVar3=NB::Funktion();

Die mit Die Direktive verbindet ihren Namensraum mit dem äußeren Verschachtelungs-Namensraum von der Position, an der sie platziert wurde, bis zum Ende des äußeren Verschachtelungs-Namensraums. Im folgenden Programm wird der NA-Namensraum mit dem globalen Namensraum verbunden. Beide Namensräume erstrecken sich dann in die fn() Funktionsdefinitions-Namensraum, in dem sie mit dem NB-Namensraum verbunden sind. Der NB-Namensraum endet am Ende des fn() Funktionsdefinition, und die beiden vorherigen Namensräume werden bis zum Ende der Datei fortgesetzt (durch den Code gelesen).

#enthalten
mit namespace std;

Namensraum NA
{
intvarInt= 6;
intFunktion()
{
RückkehrvarInt;
}

}

Namensraum NB
{
intvarInt= 7;
intFunktion()
{
RückkehrvarInt;
}
}

Verwenden des Namensraums NA;
intmyVar0=varInt;
//andere Objekte und Funktionen aus :: und NB folgen.

intfn()
{
intmyVar1=varInt;
Namensraum verwenden NB;
intmyVar2=NB::Funktion();
//weitere Objekte und Funktionen von NB folgen bis zum Ende dieses Umfangs.
RückkehrmyVar1+myVar2;
}

//Es folgen nur Objekte und Funktionen aus :: und NB.

intmyVar3=NB::Funktion();

inthauptsächlich()
{
Kosten<<myVar0<< '' <<fn() << '' <<myVar3<< ' ';

Rückkehr 0;
}

Die Ausgabe ist 6, 13, 7 .

Notiz: Der globale Namensraum ist mit . gekennzeichnet :: , was bedeutet, dass vor dem folgenden Bereichsauflösungsoperator nichts steht.

Unter der Aussage, die Verwenden des Namensraums NA; Variablen aus den globalen und NA-Namensräumen können ohne Angabe ihres Quell-Namensraums verwendet werden. Die nächste Anweisung verwendet die varInt des NA-Namespace. Die globale und NA-kombinierte Namespace-Region erstreckt sich in die fn() Funktionsnamensraum. Also, die varInt der ersten Aussage im fn() Funktionsumfang, gehört zum NA-Namespace.

Da sich die Region für die globalen und NA-Namespaces über das gesamte fn() Umfang, nach dem int myVar2 = NB::func(); , jeder Name aus dem NB-Namensraum kann nur im fn() Umfang, ohne es voranzustellen mit Hinweis:: , nur wenn es nicht in den NA- und globalen Namensräumen (Blöcken) vorgekommen ist. Andernfalls sollte ihm vorangestellt werden Hinweis:: . Die Region der kombinierten Namespaces für NA und global wird unterhalb der fn() Definition und in die hauptsächlich() Funktion bis zum Ende der Datei.

Die Erweiterung des NB-Namensraums beginnt ab int myVar2 = NB::func(); in dem fn() Block und endet am Ende des fn() Definitionsblock.

Notiz: Namespaces, deren Regionen verbunden sind, sollten nicht denselben Variablennamen in ihren verschiedenen Namespace-Blöcken haben, da dies immer noch zu Konflikten führen würde.

Namespace-Regionen

Ein Namespace ist ein Bereich. Abgesehen vom globalen Namensraum (globaler Geltungsbereich) sollte jeder Namensraum in einem Block deklariert werden. Dieser Block ist der erste Teil der möglicherweise verteilten Regionen des Namensraums. Mit der using-Direktive kann der Namespace als Regionen in anderen Scopes erweitert werden.

In einem Namensraumkörper deklarierte Entitäten werden als Mitglieder des Namensraums bezeichnet, und Namen, die durch diese Deklarationen in den deklarativen Bereich des Namensraums eingeführt werden, werden als Mitgliedsnamen des Namensraums bezeichnet.

Verschachtelte Namespaces

Das folgende Programm zeigt verschachtelte Namespaces:

#enthalten
mit namespace std;

Namensraum A
{
intich= 1;
Namensraum B
{
intich= 2;
Namensraum C
{
intich= 3;
}
}
}

inthauptsächlich()
{
Kosten<<ZU::ich << '' <<ZU::B::ich << '' <<ZU::B::C::ich << ' ';

Rückkehr 0;
}

Die Ausgabe ist:

1 2 3

Beachten Sie, dass auf die drei Werte mit dem Bereichsauflösungsoperator zugegriffen wurde.

Standard-Namensraum

C++ hat eine Bibliothek namens Standardbibliothek. Die Namen von Objekten, Funktionen und anderen Entitäten in dieser Bibliothek stammen aus einem Namensraum namens Standard-Namensraum, geschrieben als std . Die Standardbibliothek enthält Unterbibliotheken, und eine dieser Unterbibliotheken ist iostream . Die iostream Bibliothek enthält das Objekt Kosten , die verwendet wird, um Ergebnisse an die Konsole (Terminal) zu senden.

Der Name Kosten muss in der sein std Namensraum. Benutzen iostream mit std Namensraum sollte das Programm wie folgt aussehen:

#enthalten
mit namespace std;

Beachten Sie die Verwendung der mit Richtlinie und std . Der Begriff #enthalten ist eine Präprozessordirektive und endet nicht mit einem Semikolon. Es enthält die iostream-Datei an der Position seiner Anweisung.

Abschluss

Ein Namespace ist ein Bereich. Die Namespace-Beschreibung (Definition) enthält grundlegende Deklarationen und/oder Definitionen von C++-Objekten, Funktionen und anderen Entitäten. Außerhalb der Namensraumdefinition kann auf den Namen mit der Syntax zugegriffen werden, namespaceName::name . Abgesehen vom globalen Namensraum (globaler Geltungsbereich) sollte jeder Namensraum in einem Block deklariert werden. Dieser Block ist der erste Teil der möglicherweise verteilten Regionen des Namensraums. Mit dem mit -Direktive kann der Namespace als Regionen in anderen Bereichen erweitert werden. Namespaces, deren Regionen verbunden sind, sollten nicht denselben Variablennamen in ihren verschiedenen Namespace-Blöcken haben, da dies immer noch zu Namenskonflikten führen würde.

Chrys