std::cout



  • Hallo nach langem Suchen habe ich endlich ein WinSock Tutorial gefunden welches in C++ geschrieben ist und nicht in C

    aber anstatt

    cout
    

    wird in dem Tutorial

    std::cout
    

    benutzt würde es irgendwelche Nachteile mit sich bringen wenn ich

    using namespace std;
    

    inkludiere und dann einfach mit

    cout
    

    arbeite ?



  • nö.. ist glaub ich geschmackssache..

    das eine ist leichter, wenn du später mal ein cout aus einem anderen namensraum nutzen willst, das andere, wenn du dieses und ein anderes cout gleichzeitig brauchst..



  • okay



  • Ich würde die std:: Version bevorzugen, ausser du hast einen guten Grund. Z.B wenn du sonst so viel aus den Namensraum std hast, dass es eine riesen Arbeit wäre das jedesmal ranzuschreiben. Kommt aber, denke ich eher selten vor.



  • derDA schrieb:

    benutzt würde es irgendwelche Nachteile mit sich bringen wenn ich

    using namespace std;
    

    inkludiere und dann einfach mit

    cout
    

    arbeite ?

    Ja. Aber dazu gleich mehrere Anmerkungen:

    1. Inkludierst du durch ein using namespace nichts, sondern sagst damit einfach nur aus das du auf den Namensraum std zugreifst, als würde er im globalen Namensraum stehen.

    2. using namespace kann unproblematisch sein, man sollte aber dabei immer 3 Punkte im Hinterkopf behalten:
    a) Es kann zu Namenskonflikten führen (wenn du z.B. eine Funktion schreibst die genauso heißt wie eine im std Namensraum), solange dies nicht der Fall ist, ist es relativ unkritisch.
    b) Nutze using namespace NIEMALS im Header oder anderen Dateien die du direkt inkludierst. Wenn du dies machst wird ggf. das using namespace Projektweit gelten, halte es aber wegen der Gefahr von Namenskonflikten lieber so lokal wie Möglich (also am besten unterhalb der Includeanweisungen in deinen Sourcedateien [cpp]).
    c) Wenn du dir die Schreibweise ohne std angewöhnst hast du meist irgendwann Probleme zu wissen wo etwas wirklich enthalten ist

    Grundsätzlich sind Namensräume eine feine Sache, sie eignen sich auch um eigenen Code in Logische Bereiche zu untergliedern - Ohne Gefahr eines Namenskonfliktes (sofern man nicht die betroffenden Namensräume mittels using bekannt gibt).

    cu André



  • Und da das alle 3 Tage kommt, kann man es mal in die FAQ stecken.



  • Das hier versteh ich nicht so ganz wie du das meinst ein beispiel wäre gut ^^

    Es kann zu Namenskonflikten führen (wenn du z.B. eine Funktion schreibst die genauso heißt wie eine im std Namensraum), solange dies nicht der Fall ist, ist es relativ unkritisch.

    Oder meinst du das so ?

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    int namespace();
    
    namespace();
    
    cin.get();
    }
    //---------------------------------------------------------------------------
    
    int namespace()
    {
    cout<<"test";
    return 0;
    }
    


  • neee neee, so meinten wir das nicht. Damit ist gemeint.Stell dir vor du schreibst eine sort() funktion und und möchtest sie in der main benutzen. Jetzt schreibst du

    irgendwas.sort()
    

    zack und knallts, weil der kompiler weiß explizit nicht ob er die sort aus dem std oder aus deinem namensraum nehmen, wenn du nun aber schreibst

    std::sort gibtst du ihm epxlizit an das er die aus dem std nehmen soll, klar soweit?



  • Firefighter schrieb:

    zack und knallts, weil der kompiler weiß explizit nicht ob er die sort aus dem std oder aus deinem namensraum nehmen

    Also irgendwie wage ich die Vermutung aufzustellen, dass der Compiler in diesem Beispiel keines von beidem machen wird 😃



  • was genau sollte er nicht machen?



  • derDA schrieb:

    Das hier versteh ich nicht so ganz wie du das meinst ein beispiel wäre gut ^^

    Versuch mal scherzeshalber so etwas:

    1. Ohne using

    #include <string>
    typedef char string[20];
    
    int main()
    {
      string a;
      std::string b;
    }
    

    2. Mit using

    #include <string>
    typedef char string[20];
    
    using namespace std;
    
    int main()
    {
      string a; // \ Namenskonflikt
      string b; // /
    }
    

    Das ganze gilt auch für Funktionen, Klassen...

    cu André



  • Firefighter schrieb:

    was genau sollte er nicht machen?

    std::sort, ::sort oder sonst ein Namensraum::sort aufrufen. Bei Memberfunktionen ist nämlich relativ eindeutig, dass sie nicht auf Namensraum-Ebene liegen :p



  • ah okay danke.


Log in to reply