3261 Stimmen

Warum wird "using namespace std;" als schlechte Praxis angesehen?

Ich habe von anderen gehört, dass das Schreiben using namespace std; im Code falsch ist, und dass ich Folgendes verwenden sollte std::cout y std::cin stattdessen direkt.

Warum ist using namespace std; eine schlechte Praxis? Ist es ineffizient oder besteht die Gefahr, dass mehrdeutige Variablen deklariert werden (Variablen, die denselben Namen haben wie eine Funktion in std Namespace)? Wirkt sich das auf die Leistung aus?

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.

3voto

meupul Punkte 65

Ich denke, mit vor Ort ou weltweit sollte von der jeweiligen Anwendung abhängen.

Denn wenn wir die Bibliothek lokal verwenden, wird der Code manchmal ein echtes Chaos sein. Die Lesbarkeit wird gering sein.

Daher sollten wir Bibliotheken nur dann lokal verwenden, wenn es die Möglichkeit von Konflikten gibt.

Ich bin kein erfahrener Mensch. Sagen Sie mir also Bescheid, wenn ich falsch liege.

3voto

Akib Azmain Punkte 1086

Namensräume dienen dazu, Namenskonflikte zu vermeiden. C++ basiert auf C und C hat viele Probleme mit Funktions- und Variablennamen, da manchmal Funktionen aus verschiedenen Bibliotheken miteinander kollidieren. Daher begannen Bibliotheksentwickler, ihren Funktionen Bibliotheksnamen wie den folgenden voranzustellen:

foo/foo.h :

void libfoo_foo_foo_h_open(); // the name can be weird then even this one!

C++ hat Namespace eingeführt, um dieses Problem auf einfache Weise zu lösen.

Angenommen, Sie haben zwei Bibliotheken namens file y window die Dateien bzw. Windows behandelt, und den folgenden Code:

#include <file.h>
#include <window.h>

using namespace file;
using namespace window;

void open() {
     ...
}

file.h :

namespace file {
    void open(); // What!
}

window.h :

namespace window {
    void open(); // Oh no!
}

Der obige Code wird mit Sicherheit nicht kompiliert werden können.

Wenn Sie die Schrift nicht mögen std:: (nur 5 Zeichen) können Sie immer so vorgehen: (keine gute Idee in Header-Dateien)

using s = std;

Wenn Sie weiterhin die using namespace std; in Ihrer Quelldatei, dann laden Sie dieses Problem geradezu ein und ich muss Sie fragen " Was ist der ZWECK eines NAMESPACE? ".

2voto

Martin G Punkte 15799

Das folgende Beispiel zeigt, wie using namespace std; kann zu Problemen mit Namenskonflikten führen:

Definition einer globalen Variablen in C++ nicht möglich

Im Beispiel wird ein sehr generischer Algorithmusname ( std::count ) kollidiert mit einem sehr vernünftigen Variablennamen ( count ).

1voto

m_highlanderish Punkte 411

Hier ist ein Gesichtspunkt, den ich in keiner der anderen Antworten gefunden habe: Verwenden Sie nur einen Namensraum. Der Hauptgrund, warum Namespaces schlecht sind, ist laut den meisten Antworten, dass man widersprüchliche Funktionsnamen haben kann, was zu einem totalen Durcheinander führen kann. Dies wird jedoch nicht passieren, wenn Sie nur einen Namensraum verwenden. Entscheiden Sie sich für die Bibliothek, die Sie am häufigsten verwenden werden (vielleicht using namespace std; ) und bleiben Sie dabei.

Man kann sich das so vorstellen, als hätte man ein unsichtbares Bibliothekspräfix - std::vector wird einfach vector . Dies ist meiner Meinung nach das Beste aus beiden Welten: Einerseits reduziert es die Menge an Tipparbeit, die Sie tun müssen (wie es von Namespaces beabsichtigt ist) und andererseits erfordert es immer noch, dass Sie die Präfixe für Klarheit und Sicherheit verwenden. Wenn es eine Funktion oder ein Objekt ohne Namespace-Präfix gibt, wissen Sie, dass es aus dem einen Namespace stammt, den Sie deklariert haben.

Denken Sie nur daran, dass Sie, wenn Sie sich für eine globale Verwendung entscheiden, die anderen nicht lokal verwenden sollten. Dies kommt zurück zu den anderen Antworten, dass lokale Namespaces oft nützlicher sind als globale, da sie eine Vielfalt an Komfort bieten.

1voto

AlitheDev Punkte 863

Warum Namespace Std?

C++ verfügt über eine Standardbibliothek, die gängige Funktionen wie Container, Algorithmen usw. enthält, die Sie beim Erstellen Ihrer Anwendungen verwenden. Wenn die von diesen verwendeten Namen offengelegt würden, z. B. wenn eine Warteschlangenklasse global definiert würde, könnte man denselben Namen nie wieder ohne Konflikte verwenden. Daher wurde ein Namensraum, std, geschaffen, um diese Änderung aufzunehmen.

Grund 1 für die Nichtverwendung: Schlechte Praxis

Die Anweisung, den Namespace std zu verwenden, wird allgemein als schlechte Praxis angesehen. Die Alternative zu dieser Anweisung besteht darin, den Namespace, zu dem der Bezeichner gehört, bei jeder Deklaration eines Typs mit dem Scope-Operator(::) anzugeben. Diese Anweisung erspart uns zwar die Eingabe von std::, wenn wir auf eine Klasse oder einen Typ zugreifen wollen, der im std-Namensraum definiert ist, importiert aber den gesamten std-Namensraum in den aktuellen Namensraum des Programms.

Grund 2 für die Nichtverwendung: Compiler gerät durcheinander

Es ist in Ordnung, die gesamte std-Bibliothek in Spielzeugprogrammen zu importieren, aber in produktionsfähigem Code ist es schlecht. using namespace std; macht jedes Symbol, das im Namensraum std deklariert ist, ohne den Namespace-Qualifizierer zugänglich.

Zum Beispiel:

Nehmen wir nun an, Sie aktualisieren auf eine neuere Version von C++, und es werden weitere neue std-Namespace-Symbole in Ihr Programm eingefügt, von denen Sie keine Ahnung haben. Möglicherweise haben Sie diese Symbole bereits in Ihrem Programm verwendet. Nun wird der Compiler Schwierigkeiten haben, herauszufinden, ob das deklarierte Symbol zu Ihrer eigenen Implementierung gehört oder aus dem Namespace stammt, den Sie ohne jede Ahnung importiert haben. Manche Compiler geben Fehler aus. Wenn Sie Pech haben, wählt der Compiler die falsche Implementierung und kompiliert sie, was mit Sicherheit zu Laufzeitabstürzen führt.

Effekt der Namensraumverschmutzung:

Während diese Praxis für Beispielcode in Ordnung ist, ist es nicht gut, den gesamten std-Namespace in den globalen Namespace zu ziehen, da dies den Zweck von Namespaces unterläuft und zu Namenskollisionen führen kann. Diese Situation wird als Namespace Pollution bezeichnet.

1 Stimmen

FUrther Reading: dev.to/77bala7790/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X