Namensräume in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie das Schlüsselwort namespace, um einen neuen Namespace in C++ zu erstellen
  2. Verwenden Sie verschachtelte Namespaces, um komplexe Bereiche in C++ zu implementieren
Namensräume in C++

In diesem Artikel wird die Verwendung von Namespaces in C++ erläutert.

Verwenden Sie das Schlüsselwort namespace, um einen neuen Namespace in C++ zu erstellen

C++ hat das Konzept von Namespaces, die helfen, ein häufiges Problem in großen Projekten zu vermeiden, das als Namenskonflikte bezeichnet wird. Wenn das gegebene Projekt verschiedene Bibliotheken verwendet, die von unabhängigen Teams entwickelt wurden und viele globale Namen für verschiedene Objekte hat, ist es unvermeidlich, dass einige Namen übereinstimmen und Fehler verursachen. Namespace deklariert einen Bereich, in dem bestimmte Namen von Funktionen oder anderen Objekten definiert sind. Denken Sie daran, dass es in C++ automatische Bereichsregeln gibt, die regeln, wie die Namen von Objekten in verschiedenen Codebereichen angezeigt und verfügbar sind. Beispielsweise ist die in der Funktion deklarierte lokale Variable außerhalb des Funktionsrumpfs nicht sichtbar oder zugänglich. Somit kann eine andere Variable mit demselben Namen ohne Konflikte außerhalb des Rumpfs dieser Funktion deklariert werden. Auf der anderen Seite haben wir einen einzigen globalen Bereich, der oft von großen Programmen verwendet wird, um bestimmte Objekte über die Dateien oder Funktionen hinweg verfügbar zu machen. Stellen Sie sich nun vor, wie der Raum ohne manuellen Scoping-Mechanismus verwaltet werden kann.

Tatsächlich haben Programmierer mit Namenskollisionen sehr lange Namen für globale Objekte verwendet. Es kann für relativ kleine Projekte funktionieren, aber es macht den Code ziemlich unübersichtlich, und die Lösung kann Namenskollisionen immer noch nicht ohne ein koordiniertes Benennungsschema verhindern.
Namespaces bieten einen Mechanismus zum Partitionieren eines globalen Bereichs (nachfolgend Namespace genannt). Ein Namespace wird mit dem Schlüsselwort namespace gefolgt vom Namensraumnamen selbst deklariert. Dann folgt der Code in geschweiften Klammern ähnlich dem Funktionsblock und endet ohne Semikolon. Für Variablen innerhalb eines Namespace gelten dieselben automatischen Gültigkeitsbereichsregeln wie für andere Teile des Codes. Die Objektnamen, auf die von außerhalb des Namensraums zugegriffen werden muss, müssen mit dem Namensraumnamen beginnen, in dem sie definiert sind, gefolgt von einer doppelten Doppelpunkt-Notation und dann dem Objektnamen. Das folgende Codebeispiel veranschaulicht den grundlegenden Anwendungsfall für die Namespaces in derselben Datei.

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

int main() {
  int var1 = 123;

  cout << var1 << endl;
  cout << dinno::var1 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

123
456

Verwenden Sie verschachtelte Namespaces, um komplexe Bereiche in C++ zu implementieren

Namensräume können, ähnlich wie die Schleifenanweisungen, verschachtelt werden. Standardmäßig hat ein verschachtelter Namespace Zugriff auf die Objektnamen im äußeren Namespace, aber letzterer (oft als übergeordneter Namespace bezeichnet) kann nicht auf die Member im inneren Namespace zugreifen. Allerdings kann man das Schlüsselwort inline vor der Deklaration des inneren Namensraums angeben, um seine Mitglieder im übergeordneten Namensraum zugänglich zu machen. Namensräume können an verschiedenen Stellen definiert werden. Die gleiche Namespace-Definition kann sich nämlich über verschiedene Dateien oder separate Orte in der einzelnen Datei erstrecken, da im folgenden Beispiel dinno-Namespaces definiert sind.

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

namespace gini {
int var1 = 980;

namespace bean {
int var1 = 199;
}
}  // namespace gini

namespace dinno {
int var2 = 990;
}

int var1 = 123;

int main() {
  cout << var1 << endl;
  cout << dinno::var1 << endl;
  cout << gini::var1 << endl;
  cout << dinno::var2 << endl;
  cout << gini::bean::var1 << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

123
456
980
990
199
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook