using 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