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.

7voto

Dr. Watson Punkte 3682

Ich denke nicht, dass dies unter allen Umständen eine schlechte Praxis ist, aber Sie müssen vorsichtig sein, wenn Sie es verwenden. Wenn Sie eine Bibliothek schreiben, sollten Sie wahrscheinlich die Operatoren zur Bereichsauflösung mit dem Namespace verwenden, damit Ihre Bibliothek nicht mit anderen Bibliotheken in Konflikt gerät. Für Code auf Anwendungsebene sehe ich nichts Falsches daran.

7voto

adn.911 Punkte 1166

Dies ist eine schlechte Praxis, die oft als globale Namespace-Verschmutzung bezeichnet wird. Probleme können auftreten, wenn mehr als ein Namespace den gleichen Funktionsnamen mit Signatur hat, dann ist es für den Compiler unklar, welcher aufgerufen werden soll, und das alles kann vermieden werden, wenn Sie den Namespace mit Ihrem Funktionsaufruf angeben wie std::cout . Ich hoffe, das hilft. :)

7voto

Solkar Punkte 1230

"Warum wird 'using namespace std;' in C++ als schlechte Praxis angesehen?"

Ich habe es andersherum formuliert: Warum wird die Eingabe von fünf zusätzlichen Zeichen von manchen als lästig empfunden?

Denken Sie z.B. an das Schreiben einer numerischen Software. Warum sollte ich überhaupt in Erwägung ziehen, meinen globalen Namensraum zu verschmutzen, indem ich das allgemeine "std::vector" auf "vector" reduziere, wenn "vector" eines der wichtigsten Konzepte des Problembereichs ist?

23 Stimmen

Es sind nicht nur 5 zusätzliche Zeichen, sondern jedes Mal, wenn Sie auf einen Objekttyp in der Standardbibliothek verweisen, sind es 5 zusätzliche Zeichen. Was, wenn Sie die Standardbibliothek sehr viel verwenden, oft der Fall sein wird. Realistisch gesehen sind es also Tausende von zusätzlichen Zeichen in einem Programm von anständiger Größe. Vermutlich wurde die "using"-Direktive der Sprache hinzugefügt, damit sie verwendet werden kann...

5 Stimmen

Es sind nicht jedes Mal 5 zusätzliche Zeichen, sondern 5 Zeichen und wahrscheinlich ein paar Mausklicks, um ein Menü aufzurufen und eine Suche und Ersetzung in einem Editor Ihrer Wahl durchzuführen.

1 Stimmen

Lesbarkeit. cout << hex << setw(4) << i << endl; ist leichter zu lesen als std::cout << std::hex << std::setw(4) << i << std::endl;

7voto

August Karlstrom Punkte 10019

Bei unqualifizierten importierten Bezeichnern benötigen Sie externe Suchwerkzeuge wie grep um herauszufinden, wo Bezeichner deklariert werden. Dies erschwert Rückschlüsse auf die Korrektheit des Programms.

6voto

MathGladiator Punkte 1181

Das hängt davon ab, wo sie sich befindet. Wenn es sich um eine allgemeine Kopfzeile handelt, dann verringern Sie den Wert des Namensraums, indem Sie ihn in den globalen Namensraum einbinden. Denken Sie daran, dass dies ein guter Weg sein könnte, um globale Module zu erstellen.

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