using namespace std



  • warum schreiben manche programmer eigentlich nicht gleich using namespace std an den anfang und schreiben stattdessen

    std::cin.get();
    

    oder ähnliches, das ist doch einfach nur mehr arbeit oder steckt da was anderes hinter ?



  • also der befehl "using namespace beispiel" ist dazu da damit beispiel:: weggelassen werden kann ist ja klar. Nun namespaces wirst du überall finden. sie beinhalten funktionen zb cout (berichtigt mich falls ich falsch liege).
    Damit der compiler weiß das sich diese funktion cout in dem namespace std befindet muss man entweder std:: oder halt using namespace std; schreiben. Weißt du ja auch sicherlich schon. Nur was wäre der fall wenn du z.b.

    using namespace std;
    cout<<"Hallo welt";
    cout(24,true);
    

    sowas hast. Ich glaube nicht das es das bei cout gibt aber es gibt funktionen die in headern 2 mal definiert werden. Das bedeutet einmal das 1. cout in dem namespace std:: und dann nochmal ein globales cout was von überall ansprechbar ist. Damit meine ich das man angst hat das dann so etwas passiert. Ich denke der compiler wüßte dann nicht was er benutzen sollte und würde eine fehlermeldung ausgeben... wie bei diesem beispiel:

    std::cout<<"Hallo Welt"; //aha im namespace std also hallo welt ausgeben!
    cout(24,true); //aha nicht im namespace std suchen die funktion liegt irgendwo anders rum
    

    so weiß der compiler immer was man grade möchte. Wenn man sich das using angewöhnt denke ich wird es erst praktisch wirken aber im nachhinein wenn man größere programme schreibt fast(!) nur noch als fehlerquelle eignet.
    Ich hoffe du hasts verstanden 😃



  • aber ist es nicht sehr unwahrscheinlich, daß man selber oder eine gekaufte lib globale bezeichner sqrt, cout, write und so absetzt?

    und wenn doch mal, macht

    cout<<"Hallo Welt"; //aha im namespace std also hallo welt ausgeben!
    cout(24,true); //aha nicht im namespace std suchen die funktion liegt irgendwo anders rum
    

    hoffentlich einen compilerfehler. dann schreibe ich schnell um zu

    cout<<"Hallo Welt"; //aha im namespace std also hallo welt ausgeben!
    other::cout(24,true); //aha nicht im namespace std suchen die funktion liegt irgendwo anders rum
    

    falls natürloch die gekaufte lib genau den zweck hat, die std-lib zu ersetzen, brauche ich nur oben des using namespace zu ändern und habe es in der ganzen datei geändert.

    gibt es praxiserfahrungen, daß jemand mit voll qualifizierten namen mal mehr zeit eingespatz hat, als er dafür in der zeit vorher ausgegeben hat?



  • hmm *denk* 😃
    okay ich glaube nich



  • ahh interessant ...
    aber ich glaube nicht, dass ich in der nächsten zeit einen solchen "Konflikt" beheben muss, also werde ich using namespace std noch etwas weiter nutzen, spart buchstaben 😃


  • Administrator

    Also ich persönlich mache es aus zwei Gründen:
    1. Wegen der Übersicht. Ich weiss woher die Funktion kommt, also von welcher Bibliothek, bzw. welchem Modul. Ich meine, es ist schön, wenn der Kompiler das weiss, aber ich möchte dies auch wissen und habe leider nicht diese Übersicht, welcher der Kompiler hat 🙂
    2. Konfliktvermeidung, bevor überhaupt einer passiert. Ka, ob es jemals einen gegeben hätte, es ist einfach eine Prävention. In der Theorie, können da übrigens ganz fiese Konflikte entstehen, welche nicht mal einen Kompilerfehler werfen. Aber ich habe keine Ahnung, ob die auch schon mal in der Praxis aufgetreten sind.

    Das einzige was ich höchstens mal mache, ist ein using namespace in einem Scope. So wird der Namensraum nur für den Scope geöffnet. Oder ein namespace rename mache ich zum Teil auch.

    Und global im Header gilt natürlich absolutes Tabu, aber das wurde ja schon oft erklärt wieso.

    Grüssli



  • nur so nebenbei: man soll niemals "using namespace std" in einer headerdatei benutzen. betrifft mich zum glück nicht oder nur selten, weil ich die funktionen, die cout oder stringfunktionen benutzen, eigentlich immer in die *.cpp stopfe. allein schon wegen der erhöhten compiliergeschwindigkeit.



  • **** ich glaube ich hatte mal einen aber das ist eine andere Geschichte
    Die Übersicht ist überzeugend hmmm...

    ~(@ Dravere aufgrund deiner Codes kam die Frage erst)~



  • aus gewohnheit und weil ichs hübscher find 😉
    und von den 5 zeichen werd ich scho ne gleich sterben ^^ und ich kenn auch keinen, den das irgendwelche nachteile gebracht hätte, es mitzuschreiben ^^

    volkard schrieb:

    falls natürloch die gekaufte lib genau den zweck hat, die std-lib zu ersetzen, brauche ich nur oben des using namespace zu ändern und habe es in der ganzen datei geändert.

    hab ich in der praxis noch nie gesehen - hab da zwar au net so viel erfahrung wie du haben wirst, aber naja...

    bb



  • unskilled schrieb:

    volkard schrieb:

    falls natürloch die gekaufte lib genau den zweck hat, die std-lib zu ersetzen, brauche ich nur oben des using namespace zu ändern und habe es in der ganzen datei geändert.

    hab ich in der praxis noch nie gesehen - hab da zwar au net so viel erfahrung wie du haben wirst, aber naja...

    ich kenne nur einen programmierer, der gelegentlich und dann nur aus spaß sein eigenes cout benutzt.
    das argument war also genauso schwach wie das mit der fehlersicherheit. 😃



  • Ich verwende using namespace std (in aller Regel) nicht. Im Header ist das tabu und ich möchte keinen anderen C++-Stil in der cpp-Datei. Soll ich etwa das std:: löschen, wenn ich eine Funktion oder Methode aus dem Header in die cpp verschiebe?

    Na ja - das war erst mal das Stil-Argument. Es gibt aber noch ein gewichtigeres Argument:

    Namespaces dienen dazu, Symbolkonflikte zu vermeiden. Der Ausdruck "using namespace ..." mischt 2 Namespaces. Also er macht dieses Namespace-Feature quasi wieder Rückgängig. Wenn ich in 2 Bibliotheken 2 Symbole mit gleichem Namen habe aber unterschiedlichen Namespaces, dann darf ich nur eines von beiden mit "using namespace" importieren. Also werde ich die eine Bibliothek voll qualifiziert angeben und die andere nicht. Das ist inkonsequent. Versucht man konsequent zu sein, dann ist das "using namespace" also Tabu.

    Ich möchte auch nicht den std-Namespace anders behandeln, als andere Namespaces. Es gibt ihn aus gutem Grund. Ich möchte ihn nutzen.

    Es gibt auch durchaus Situationen, wo man gleiche Namen der Standardbibliothek bewusst nutzt. Beispielsweise habe ich mal eine Klasse geschrieben, die einen iostream auf einem TCP-Socket implementiert. Diese Klasse heisst cxxtools::net::iostream. Schon der Bezeichner sagt mir, dass diese Klasse aus der Bibliothek cxxtools kommt und dort aus dem Netzwerk-Modul. Außerdem sagt er mir, dass es sich um einen iostream handelt. Dadurch habe ich bereits bei der Benutzung des Bezeichners dem Codeleser wesentliche Informationen gegeben, um meinen Code zu verstehen.

    Wenn ich jetzt aber irgendwo ein "using namespace std" aufgerufen habe, dann finde ich möglicherweise irgendwo anders im Code "iostream". Jetzt ist es nicht offensichtlich, ob es sich um den std::iostream handelt oder etwa den cxxtools::net::iostream. Ich muss im Code suchen, ob ich den std-namespace oder den cxxtools::net-namespace importiert habe, oder aber ich mich aktuell im cxxtools::net-namespace befinde. Das hilft also nicht gerade, den Code leicht verständlich zu machen.


Anmelden zum Antworten