2010-01-16 14 views
6

Possible Duplicates:
Why is ‘using namespace std;’ considered a bad practice in C++?
Using std NamespaceC++ - Namespaces - "using" oder explizit angegeben?

Ist es nur eine Frage der Präferenz? Oder gibt es einen triftigen Grund für die Bevorzugung

using namespace std; 
#include <string> 
myString string; 

oder

#include <string> 
myString std::string; 

Ich nehme an, dass explizit den Namensraum unter Angabe jedes Mal, während ein Drag-Typen, jede Möglichkeit der Namenskonflikte vermeidet (oder würde der Compiler warnen vor Mehrdeutigkeit?)

Frage: Gibt es ein überzeugendes Argument auf die eine oder andere Weise?

+2

Dupe von http://stackoverflow.com/questions/1452721/why-isusing-namespace-std-das-betrachtete-bad-praxis-in-c unter vielen, viele andere. –

+0

Sie haben Recht! Warum habe ich diese nicht gefunden, als ich gesucht habe? Entschuldigung – Mawg

Antwort

4

Dies ist eine modifizierte Version einer anderen Antwort, die ich zum gleichen Thema schrieb. Bis zur Version 3 jetzt.

Das Hauptproblem ist Namenskonflikte, in dem, wenn Sie eine Variable count in Ihrem Code haben und Sie sind using namespace std; wird es mehrdeutig sein, was Sie meinen. Es ist nicht nur count. reverse und equal werden ebenfalls enthalten sein, die alle gemeinsamen Identifikatoren sind. Zum Beispiel führt dies zu einem Compiler-Fehler:

#include <algorithm> 
using namespace std; 

int count; 
int main(int argc, char* argv[]){ 
    count = 1; 
} 

alle Probleme an den Compiler Ohne Berücksichtigung, es ist auch ein Problem für jeden kommen Sie Ihren Code zu lesen. Diese zusätzlichen 5 Zeichen dafür, dass die nächste Person, die Ihr Code knowns genau beibehalten, was Sie meinen, ohne den Anfang der Datei jede zweite Zeile zu überprüfen, um zu sehen, ob Sie std::string oder mylib::string bedeuten, wenn Sie string


schreiben Es ist auch Beachten Sie, dass Sie nie eine using namspace xyz in eine Header-Datei einfügen sollten, da sie auf alle Dateien übertragen werden kann, die diese Header-Datei enthalten, auch wenn sie diesen Namespace nicht verwenden möchten. Ein weiteres Problem hier ist, dass es auch nicht klar ist, dass der Namespace std importiert wurde, so der Betreuer (oder Sie in 3 Monaten Zeit) eine Variable mit dem gleichen Namen wie einige obskure Std-Funktion, die in der gleichen Kompilierungseinheit und enthalten war Dann verbringt er eine Stunde damit, die Ursache des Kompilierungsfehlers zu finden.

(Von Effective C++) In den meisten Fällen ist es sehr vorteilhaft ist

using std::swap 

zu verwenden, als ob es eine spezielle Version von Swap ist, wird der Compiler, dass verwenden, sonst wird es auf std::swap fällt zurück . Wenn Sie std::swap aufrufen, verwenden Sie immer die Basisversion, die die spezialisierte Version nicht aufruft (selbst wenn sie existiert).

Nehmen Sie zum Beispiel Code mit der pimpl idiom. Wo als die Standardkopie alle Daten in der tatsächlichen Implementierung kopieren können, wo alles, was getan werden muss, ist das Vertauschen der Zeiger. Durch die Verwendung eines speziellen Swaps können enorme Ausführungszeit eingespart werden und gut gestaltete Bibliotheken sollten darauf spezialisiert sein.


Zusammengefasst

  • Immer lieber using std::swap über std::swap()

  • Vermeiden using namespace std in einem Header auf allen Kosten aufgrund der Ausbreitung, versuchen Sie es mit ihm in Implementierungsdateien zu vermeiden.

  • Tausende von using std::foo an der Spitze jeder Datei ist nicht der Weg zu gehen. Verwenden Sie es höchstens für häufig verwendete Klassen.

Alles andere ist Meinung.

+0

Lol ... (Fast) jeder Betrüger dieser Frage hat eine Antwort von dir ...: D – missingfaktor

2

Anwendungen sind in cpp-Dateien in Ordnung. Sie würden die zweite Syntax in Headern bevorzugen, damit Sie sie nicht im gesamten Projekt verbreiten.

3

Persönlich bevorzuge ich die using Deklaration anstelle der using Richtlinie.

Zum Beispiel:

#include<string> 
using std::string; 

string x="abc"; 

Mit der using Richtlinie bringt die gesamte Namespace in Umfang, die später Namen Kollisionsprobleme verursachen könnten. Für weitere Informationen lesen Sie this