Verwenden Sie es nicht global
Sie wird nur dann als "schlecht" angesehen, wenn weltweit eingesetzt . Weil:
- Sie bringen den Namensraum, in dem Sie programmieren, durcheinander.
- Die Leser werden Schwierigkeiten haben zu erkennen, woher ein bestimmter Identifikator kommt, wenn Sie viele
using namespace xyz;
.
- Was auch immer gilt für andere Leser Ihres Quellcodes ist, gilt noch mehr für den häufigsten Leser: Sie selbst. Kommen Sie in ein oder zwei Jahren wieder und sehen Sie sich das an...
- Wenn Sie nur über
using namespace std;
Sie sind sich vielleicht gar nicht bewusst, was Sie da alles mitnehmen - und wenn Sie eine weitere #include
oder zu einer neuen C++-Revision wechseln, kann es zu Namenskonflikten kommen, die Ihnen nicht bewusst waren.
Sie können es lokal verwenden
Sie können es lokal (fast) frei verwenden. Dies verhindert natürlich die Wiederholung von std::
-- und Wiederholungen sind auch schlecht.
Eine Redewendung für die lokale Nutzung
Unter C++03 gab es eine Redewendung -- Code aus dem Baukasten -- für die Umsetzung einer swap
Funktion für Ihre Klassen. Es wurde vorgeschlagen, dass Sie tatsächlich eine lokale using namespace std;
-- oder zumindest using std::swap;
:
class Thing {
int value_;
Child child_;
public:
// ...
friend void swap(Thing &a, Thing &b);
};
void swap(Thing &a, Thing &b) {
using namespace std; // make `std::swap` available
// swap all members
swap(a.value_, b.value_); // `std::stwap(int, int)`
swap(a.child_, b.child_); // `swap(Child&,Child&)` or `std::swap(...)`
}
Dies bewirkt die folgende Magie:
- Der Compiler wählt die
std::swap
pour value_
d.h. void std::swap(int, int)
.
- Wenn Sie eine Überlastung haben
void swap(Child&, Child&)
implementiert ist, wird der Compiler sie auswählen.
- Wenn Sie das tun no diese Überladung haben, verwendet der Compiler
void std::swap(Child&,Child&)
und versuchen Sie Ihr Bestes, um diese zu tauschen.
Mit C++11 gibt es keinen Grund mehr, dieses Muster zu verwenden. Die Implementierung von std::swap
wurde geändert, um eine potenzielle Überlast zu finden und diese auszuwählen.
710 Stimmen
Vergessen Sie nicht, was Sie tun können: "using std::cout;", was bedeutet, dass Sie nicht std::cout eingeben müssen, aber nicht gleichzeitig den gesamten std-Namensraum mit einbeziehen.
115 Stimmen
Es ist besonders schlecht, 'using namespace std' in Headerdateien im Dateisystem zu verwenden. Die Verwendung in Quelldateien (*.cpp) im Dateisystem nach allen Includes ist nicht ganz so schlimm, da ihre Wirkung auf eine einzige Übersetzungseinheit beschränkt ist. Noch weniger problematisch ist die Verwendung innerhalb von Funktionen oder Klassen, da die Wirkung auf den Funktions- oder Klassenbereich beschränkt ist.
15 Stimmen
Ich würde davon abraten, die using-Direktive zu verwenden, aber für bestimmte Namespaces wie
std::literals::chrono_literals
,Poco::Data:Keywords
,Poco::Units
und andere Dinge, die mit Literalen oder Lesbarkeitstricks zu tun haben. Immer dann, wenn es in Header- oder Implementierungsdateien steht. In einem Funktionsbereich mag es in Ordnung sein, aber abgesehen von Literalen und anderen Dingen ist es nicht nützlich.1 Stimmen
@sh- Warum meinen Sie, dass es "besonders schlecht" ist, "using namespace std" zu verwenden?
22 Stimmen
@Jon: Es hat nichts mit dem Namespace std im Besonderen zu tun. Meine Betonung lag auf "in Dateigröße in Header-Dateien". Um es als Ratschlag zu formulieren: Verwenden Sie "using namespace" (std oder andere) nicht im Dateisystem von Header-Dateien. Es ist OK, es in Implementierungsdateien zu verwenden. Entschuldigung für die Zweideutigkeit.
11 Stimmen
Es wird nur in Kopfzeilen als schlechte Praxis angesehen. In Quelldateien, die nicht anderweitig eingebunden sind (z. B. cpp-Dateien), ist es in Ordnung. Siehe @mattnewport 's Antwort unten. stackoverflow.com/a/26722134/125997
3 Stimmen
Ich habe den anderen keine Antwort hinzuzufügen, aber ich benutze:
using [namespace]::[identifier];
im lokalen Bereich von relativ einfachen Quelldateien. Wenn ich zum Beispiel einen Header habe, der häufig die voll qualifizierte:std::size_t
Typ, werde ich normalerweise vorangestellt:using std::size_t;
zur Umsetzung. Dies vereinfacht Lesen den Code und wirkt sich nur auf den lokalen Bereich aus - das heißt:using std::[identifier];
verwendet die Prinzip der geringsten Überraschung . Es gibt zu viele Bezeichner in derstd
Namespace, den man im Auge behalten muss. Spätere C++-Revisionen können Bezeichner hinzufügen, die mit Ihren eigenen kollidieren!0 Stimmen
Das macht Ihren Code einfacher.
0 Stimmen
>Warum ist das so? Weil die Leute in manchen Bereichen nichts wirklich zu tun haben und anfangen, über Dinge zu debattieren, die nicht wichtig sind. In der Sprache C++ können Sie jede Strategie verwenden, aber bitte verstehen Sie die using-directive und die using-declaration.