Vincent Robert hat Recht in seinem Kommentar Wie verwendet man Namespaces in C ++ richtig? .
Namespace verwenden
Namespaces werden zumindest verwendet, um Namenskollisionen zu vermeiden. In Java wird dies durch die Redewendung "org.domain" erzwungen (da angenommen wird, dass man nichts anderes als seinen eigenen Domainnamen verwendet).
In C ++ können Sie dem gesamten Code in Ihrem Modul einen Namespace zuweisen. Für ein Modul MyModule.dll können Sie seinem Code beispielsweise den Namespace MyModule geben. Ich habe anderswo jemanden gesehen, der MyCompany :: MyProject :: MyModule verwendet. Ich denke, das ist übertrieben, aber alles in allem scheint es mir richtig zu sein.
Verwenden von "using"
Die Verwendung sollte mit großer Sorgfalt erfolgen, da ein (oder alle) Symbole aus einem Namespace effektiv in Ihren aktuellen Namespace importiert werden.
Es ist böse, dies in einer Header-Datei zu tun, da Ihr Header jede Quelle einschließlich dieser verschmutzt (es erinnert mich an Makros ...), und selbst in einer Quelldatei einen schlechten Stil außerhalb eines Funktionsbereichs, da er im globalen Bereich importiert wird die Symbole aus dem Namespace.
Die sicherste Möglichkeit, "using" zu verwenden, besteht darin, ausgewählte Symbole zu importieren:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Sie werden eine Menge "using namespace std" sehen. in Tutorial- oder Beispielcodes. Der Grund ist, die Anzahl der Symbole zu reduzieren, um das Lesen zu erleichtern, nicht weil dies eine gute Idee ist.
"using namespace std;" wird von Scott Meyers entmutigt (ich erinnere mich nicht genau, welches Buch, aber ich kann es bei Bedarf finden).
Namespace-Zusammensetzung
Namespaces sind mehr als Pakete. Ein weiteres Beispiel findet sich in Bjarne Stroustrups "The C ++ Programming Language".
In der "Special Edition" unter 8.2.8 Namespace Composition beschreibt er, wie Sie zwei Namespaces AAA und BBB zu einem anderen namens CCC zusammenführen können. Somit wird CCC sowohl für AAA als auch für BBB zu einem Alias:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Sie können sogar ausgewählte Symbole aus verschiedenen Namespaces importieren, um Ihre eigene benutzerdefinierte Namespace-Oberfläche zu erstellen. Ich habe noch keine praktische Anwendung gefunden, aber theoretisch ist es cool.
std
, Symbolen den Namespace voranzustellen, als ihnusing
überhaupt zu verwenden. Also schreibe ich immerstd::cout
oderstd::string
jetzt, weil ich sie jetzt so nenne. Ich würde niemals einfach schreibencout
.