using namespace std
-
es gibt ja "using namespace std" damit man nicht std::cout schreiben muss.
einige scheinen das aber nicht zu nutzen. warum?gibt es Ausdrücke die sowohl std::Ausdruck als kp::Ausdruck sein können und wenn man dann using namespace std einbindet kp::Ausdruck nicht funktioniert??
wenn ja gibt mal bitte ein Beipiel für Ausdruck
-
namespace foo_bar { void bar(); }; namespace bar_foo { void bar(); }; void func() { using namespace bar_foo; bar(); // == bar_foo::bar(); bar_foo::bar(); foo_bar::bar(); } void func_2() { usign namespace bar_foo; usign namespace foo_bar; bar(); // ja welches ist es denn jetzt?! }
-
Der Sinn von Namespaces ist es Namenskonflikte zu vermeiden. Wenn du z.B. den Namen 'foo' zweimal vergeben willst funktioniert das im selben Namespace nicht. Packst du die beiden 'foo's in unterschiedliche Namespaces ist das wieder kein Problem, dann wird aus foo, foo halt xyz::foo, abc::foo und du hast keinen Namenskonflikt.
Using namespace xyz untergräbt den Sinn von Namespaces aber total, verwendest du z.B. using namespace xyz wird überall wo du foo aufrufst der Namespace 'xyz' vorausgesetzt und du bekommst wieder Probleme. Im schlimmsten Fall kollidieren wieder Namen miteinander.Bei kleinen Projekten mag das zwar ganz egal sein, bei großen Projekten aber durchaus nicht. Wenn man aber so faul ist und sich die paar Zeichen sparen will sollte man einige Punkte beachten.
Zum Beispiel sollte man niemals using namespace in einem Header verwenden. Jeder der den Header inkludiert bekommt nämlich dadurch den Namespace aufgezwungen, war nie wünschenswert ist.Man kann using namespace auch in einem Funktionsblock verwenden. Dann ist die Wirkung auf den Scope bekrenzt. Oder man gibt genau an was man aus einem anderen Namespace benutzen will, per using std::cout; using std::cin;
grüße
-
In einem kleinen Projekt ist es eher unwarscheinlich dass es zu Problemen kommt.
Wenn du dich aber hier umhörst wirst du immer wieder feststellen, dass mysteriöse Fehlermeldungen auftreten, die sich durch das Entfernen der using-Direktive abschalten lassen.
Daher ist es IMHO empfehlenswert immer auf das using namespace zu verzichten, damit man sich keinen "schlechten Stil" angewöhnt.
Ein anderer Punkt ist dann auch direkt die "Stilfrage". Mit einem std:: - Prefix ist es deutlich ersichtlich, dass du auf Funktionalität der Standard Bibliotek zurückgreifst. Gerade bei seltereren Funktionen kann das uU das suchen nach dem Ursprung dieser erleichtern ...
In Headerdateien kommt dann noch hinzu, dass durch das gegenseitige inkluden der namspace unerwartet "geused" wird, nud hier dann einen Fehler zu finden wird deutlich kompliziert.
Daher: Gewöhnt es euch gar nicht erst an "using namespace std" zu verwenden!
P.S.: Wenn ich das richtig in Erinnerung habe ist eben jenes using namespace std dafür gedacht, alte C-Programme leichter konvertieren zu können (Auch die cstdlib liegt ja in C++ im namespace std).
-
es kracht meistens, wenn ein code keinen eigenen namespace nutzt
//fremderlibheader.hpp //my string class string { }; ... //main.cpp #include "fremderlibheader.hpp" #include <string> using namespace std; string str;//Bumm
mit verschiedenen namespaces brauchts dann schon ein using in nem header um das ganze den bach runter gehen zu lassen
//fremderlibheader1.hpp #include <string> using namespace std; void foo(const string& str){...} //fremderlibheader2.hpp namespace kp{ //my string class string { private: std::string data; }; } //main.cpp #include "fremderlibheader1.hpp" #include "fremderlibheader2.hpp" using namespace kp; string str;//Bumm
in *.cpp dateien ist das benutzen eines namespaces normalerweise kein problem, ein using in einem header ist aber unberechenbar.
-
darthdespotism schrieb:
In einem kleinen Projekt ist es eher unwarscheinlich dass es zu Problemen kommt.
Ich glaube ich habe mich bis jezt nur mit kleinen Projekten beschäftigt, denn in meinem Buch gibt es nur Codes mit "using namespace std;"
aber namespaces kann ich soagar schon proggen.Wenn ich also den namespace xyz habe und funtionen wie xyz::blabla dann funktionieren
geht das dann wenn ich oben using namespace xyz; einbaue und ich immer std::cout verwende,
oder gibt es dann Probleme?PS Ich meine nartürlich nur theoretisch, praktisch werd ich das nie machen
-
lass das "using namespace *" einfach weg.
Wenn die Namespaces nicht ellenlange Namen haben entsteht dadurch kein Nachteil, die Herkunft der Namen wird deutlicher und die Art von Problemen kannst du vollständig ausschließen.Und wenn du in der .cpp einzelne Elemente wie std::cout per using std::cout einbindest weißt du genau welche Namen aus std:: direkt verfügbar sind und du kannst auf diese bewusst verzichten.
EDIT://
Ein Buch dass using namespace verwendet würde ich auf keinen Fall empfehlen!
-
darthdespotism schrieb:
EDIT://
Ein Buch dass using namespace verwendet würde ich auf keinen Fall empfehlen!Übertreib mal nicht!
-
darthdespotism schrieb:
Wenn die Namespaces nicht ellenlange Namen haben entsteht dadurch kein Nachteil
Und wenn es doch ein langer Name ist, kann man ja immer noch ein Namespace-Alias festlegen:
namespace lnn = langer_namespace_name;
-
Ein Buch dass using namespace verwendet würde ich auf keinen Fall empfehlen!
. Dann empfehle ich mal dringend nicht auf Ratschläge von darthdespotism zu hören - zumindest was C++ (Bücher) angeht.
Wenn die Namespaces nicht ellenlange Namen haben entsteht dadurch kein Nachteil, die Herkunft der Namen wird deutlicher und die Art von Problemen kannst du vollständig ausschließen.
Wo du so auf die Herkunft der Namen aus bist: was machst du da gegen Templates im Allgemeinen und ADL im Speziellen? Verbieten?
Und schreibst du z.B. auch immer schön fleißig
std::string s = ...
std::operator<<(std::cout, s);
?std::cout << s; verschleiert schließlich die Herkunft des operator<<.
Es wäre so schön, wenn C++ Programmierer *verstehen* würden, warum using-Direktiven und insbesondere (Namespace-Level) using-Deklaration nicht in Header gehören. Dann bräuchte man nicht mit (zweifelhaften) Rundumverboten wie "benutzt keine using-Direktiven" kommen.
-
michba schrieb:
Und wenn es doch ein langer Name ist, kann man ja immer noch ein Namespace-Alias festlegen:
namespace lnn = langer_namespace_name;
das klappt tollerweise auch bei verschachtelten namespaces:
namespace fbft=foo::bar::foobar::test;
-
darthdespotism schrieb:
Ein Buch dass using namespace verwendet würde ich auf keinen Fall empfehlen!
warum denn nicht?
ich habe damit gut gelernt. Klassen auf Anhieb verstanden. Das Buch ist gut. Na gut, 15 Seiten für die Erklärung der Online Hilfe ist übertrieben. Aber das Buch ist für Anfänger leicht verständlich.
-
Ich hab das gestern wohl doch deutlich übertrieben.
Von nem guten Buch würde ich aber trotzdem verlangen dass es ein using namespace std nicht verwendet ohne auf mögliche Komplikationen hinzuweisen, den Effekt der Direktive(?) klar darzustellen.
-
Fussel schrieb:
Na gut, 15 Seiten für die Erklärung der Online Hilfe ist übertrieben.
Das an sich währe für mich eher ein Grund einen Bogen um ein Buch zu machen. Wenn ich mir ein Buch über eine Sprache hole erwarte ich das die Sprache, nicht der Compiler erklärt wird. Eine Minimaleinführung ist okay (gerne auch mit Verweis auf Quellen in dem man mehr lesen kann), der Rest hat aber nichts in einer Spracheinführung zu tun (Oder es sollte aus dem Titeleinschlag direkt ersichtlich sein).
Ich habe leider schon viel zu viele Bücher in der Hand gehabt wo ich das Gefühl hatte im wesentlichen eine Kopie der Compilerbeschreibung und anschließend der Onlinehilfe zu haben. Da mag der Rest vom Buch noch so gut sein, doch wenn mir sowas unter die Fuchteln kommt, lese ich garnicht weiter. Das schlimmste was ich je hatte war ein Buch was vom Titel her irgendwas mit "Windowsprogrammierung" und "MFC" zu tun hatte. Was war der Inhalt? Die letzten 20 Seiten hatten tatsächlich etwas damit zu tun. Der Rest bestand zur Hälfte aus Compiler/Onlinehilfe die andere Hälfte aus einer bescheidenen C++ Einführung, die von der Qualität etwa auf dem Stand von jemanden war der vielleicht ein halbes Jahr C++ gelernt, und im Hinterkopf nur die C-Denkweise hat.
cu André
-
darthdespotism schrieb:
Von nem guten Buch würde ich aber trotzdem verlangen dass es ein using namespace std nicht verwendet ohne auf mögliche Komplikationen hinzuweisen, den Effekt der Direktive(?) klar darzustellen.
ACK.
-
man kann ich einem buch nicht alles erwähnen. und ein "using namespace std" ist nun wirklich nichts, was nen programm instabil, schlechter oder sonstwas macht. wenns konflikte gibt, gibt es welche, wenns keine gibt, gibt es keine
es ist technisch unmöglich, mit nem using namespace irgendetwas anzustellen, was unerwünschtes verhalten hervorruft. das programm lässt sich nämlich schlicht nicht kompilieren, solange kollisionen vorhanden sind.
-
Sicher kann man in einem Buch nicht alles erklären was es in C++ gibt.
Aber wenn etwas verwendet wird kann man eine ordentliche Erklärung erwarten, vor allem wenn der Verzicht darauf derart trivial zu bewerkstelligen ist wie bei using namespace std