Erklärung für "using namespace std"
-
Hi,
ich muss in schriftlicher Form erklären, wozu man using namespace std; braucht. Ehrlich gesagt, weiß ich das selber nicht so genau. Wie erklärt man das am Besten mit wenigen Worten???
Gruß
Sarah
-
Ein Namensraum dient allgemein zur Einordnung der darin enthaltenen Funktionen/Klassen/Variablen/... - wenn du ein Element dieses Namensraums nutzen willst, mußt du entweder "xyz::" vor dessen Namen schreiben, "using xyz::abc;" am Anfang der Datei schreiben (für das Objekt abc aus dem Namensraum) oder "using namespace xyz;" (für alle Objekte des Namensraums).
(und "std" ist der Namensraum, in dem die komplette C++ Standardbibliothek untergebracht ist)
-
using namespace std;
macht all das, was im Namensraum std enthalten ist und durch Header bereits eingebunden wurde, im aktuellen Namensraum bekannt. ( Funktionen, Typen, ... )
BR evilissimo
-
DANKE!!!
hat mir wirklich weiter geholfen
-
"using namespace std" braucht man, um das Namespace-Konzept von C++ ad-absurdum zu führen.
Namespaces dienen dazu, Namensbereiche zu trennen. Mit diesem unsäglichen "using namespace" wird genau das wieder aufgehoben.
Oder anders ausgedrückt: Laßt es einfach weg und schreibt std::string, std::cout, std::endl usw. Im Header ist es sowieso dringendst empfohlen.
Tommi
-
tntnet schrieb:
"using namespace std" braucht man, um das Namespace-Konzept von C++ ad-absurdum zu führen.
Namespaces dienen dazu, Namensbereiche zu trennen. Mit diesem unsäglichen "using namespace" wird genau das wieder aufgehoben.
Oder anders ausgedrückt: Laßt es einfach weg und schreibt std::string, std::cout, std::endl usw. Im Header ist es sowieso dringendst empfohlen.
Tommi
Im Header stimme ich dir zu. using namespace macht aber generell schon Sinn. Erstens kannst du bei Namenskonflikten den Bezeichner immer noch voll qualifizieren und zweitens hast du oben im Quellcode einfach eine gute Übersicht von dem, was du benutzt.
-
Optimizer schrieb:
Im Header stimme ich dir zu. using namespace macht aber generell schon Sinn. Erstens kannst du bei Namenskonflikten den Bezeichner immer noch voll qualifizieren und zweitens hast du oben im Quellcode einfach eine gute Übersicht von dem, was du benutzt.
Die Übersicht habe ich auch in den #include-Direktiven. Und ausserdem ist gerade das genannte "using namespace std" so ziemlich nichts sagend.
Unübersichtlich ist eher, wenn eine Klasse im Header blah::Blah heißt, im Cpp aber nur noch Blah.
Ein anderere Fall: Es gibt eine Klasse ns1::Blah und eine Klasse ns2::Blah. Im Header ist es Klar, was ich verwende, aber in der Implementierung steht dann nur noch Blah und ich muß erst mal schauen, welches Blah denn nun mit using in den aktuelle Namespace gemischt wird.
Man kann natürlich einwenden, ob eine Klasse in 2 Namespaces mit dem gleichen Namen auftauchen sollten, aber genau das ist Sinn der Namespaces. Manchmal ist es auch gewollt. Beispielsweise habe ich in meiner Toolbox cxxtools eine Klasse cxxtools::net::iostream. Da kann man doch sogleich vermuten, daß das eine von std::iostream abgeleitete Klasse für das Netzwerk ist, die aus der Toolbox cxxtools stammt. Verwende ich in meiner cpp nur iostream, sehe ich nicht auf den ersten Blick, was da eigentlich gemacht wird.
Tommi
-
tntnet schrieb:
Optimizer schrieb:
Im Header stimme ich dir zu. using namespace macht aber generell schon Sinn. Erstens kannst du bei Namenskonflikten den Bezeichner immer noch voll qualifizieren und zweitens hast du oben im Quellcode einfach eine gute Übersicht von dem, was du benutzt.
Die Übersicht habe ich auch in den #include-Direktiven. Und ausserdem ist gerade das genannte "using namespace std" so ziemlich nichts sagend.
Der Unterschied ist aber - im einem CPP-File kannst du kontrollieren, welche Standard-Header eingebunden wurden (und damit hast du recht guten Überblick, welche Namen das "using namespace std;" in den globalen Namensraum schleifen würde), in einem Header fehlt dieser Überblick, weil es auch Konflikte mit anderen Headern geben könnte, die vor deinem eingebunden werden (und dann hat ein Anwender das Problem mit dem Namenskonflikt)