3x Anfängerfragen



  • Hallo,

    1. Ich sehe häufig dass Leute in ihren Quelltexten kein

    using namespace std;
    

    verwenden sondern beispielsweise so

    std::string
    

    schreiben, doch warum? Was sind die Nachteile , wenn man using namespace verwendet bzw. wann ist es sinnvoll dies zu tun?

    2. Die Hauptfunktion heisst ja

    int main ()
    

    aber warum gibt die main Funktion immer ein int zurück?-Gut, am Ende der Funktion steht ja:

    return 0;
    

    wobei 0 sowohl ein integer ist als auch der Exit-Code aber es gibt ja auch noch die Möglickeit:

    return EXIT_SUCCESS;
    

    😕 😕

    3. Gibt es eine Funktion, welche auf eine Eingabe eines Benutzers sofort reagiert nachdem sie vollzogen ist, dh nich mit einer Betätigung der ENTER-Taste bestätigt werden muss, wie es bei

    std::cin
    

    der Fall ist?



  • GastXYZ schrieb:

    Hallo,

    1. Ich sehe häufig dass Leute in ihren Quelltexten kein

    using namespace std;
    

    verwenden sondern beispielsweise so

    std::string
    

    schreiben, doch warum? Was sind die Nachteile , wenn man using namespace verwendet bzw. wann ist es sinnvoll dies zu tun?

    Wenn du using namespace xyz verwendest machst du den kompletten Inhalt des Namespace global bekannt. Mit anderen Worten, der Namespace macht keinen Sinn mehr.
    Using namespace untergräbt also im Grunde den Sinn von Namespaces und sollte deshalb möglichst selten verwendet werden. Stell dir vor du hast ein großes Projekt mit vielen Namespaces aber verwendest an jeder Stelle "using namespace xyz"? Dann hättest du dir die ganzen Namensräume auch sparen können. Im Schlimmsten Fall bekommst du Namenskonflikte und kannst dein Programm nicht mehr übersetzen.

    Drum: Wenn using, dann selektiv. Ansonsten ist es besser den Namespace immer vor die jeweilige Funktionalität (...) zu schreiben.

    GastXYZ schrieb:

    2. Die Hauptfunktion heisst ja

    int main ()
    

    aber warum gibt die main Funktion immer ein int zurück?-Gut, am Ende der Funktion steht ja:

    return 0;
    

    wobei 0 sowohl ein integer ist als auch der Exit-Code aber es gibt ja auch noch die Möglickeit:

    return EXIT_SUCCESS;
    

    😕 😕

    EXIT_SUCCESS steht einfach für 0. Vermutlich in etwa so:

    #define EXIT_SUCCESS 0
    

    GastXYZ schrieb:

    3. Gibt es eine Funktion, welche auf eine Eingabe eines Benutzers sofort reagiert nachdem sie vollzogen ist, dh nich mit einer Betätigung der ENTER-Taste bestätigt werden muss, wie es bei

    std::cin
    

    der Fall ist?

    Ja gibt es. In verschiedenen API gibt es verschiedene Ansätze: _getch() z.B.



  • Hi!

    using namespace std;
    

    Bindet den gesammten namespace std ein. D.H. dir stehen dann alle in sdt definierten Klassen und Funktionen zu verfügung.

    using std::string;
    

    Bindet nur std::string ein. Eine weiter möglichkeit wäre:

    #include <iostream>
    
    int main()
    {
      std::string s = "Hello World";
    
      std::cout << s << std::endl;
    
      return 0;
    }
    

    Ich glaube EXIT_SUCCESS ist nur ein define auf 0.

    mfg bauerb



  • Ok Vielen vielen Dank.
    👍



  • Und jetzt noch zur Erklärung, was eigentlich Namespaces sind:

    Stell dir vor du hast zwei Schubladen, eine namens "namespace std" und die andere "dein code" und noch einen Tisch den "global namespace".

    In der std-Schublade sind die ganzen Standardsachen drin. Wenn du jetzt irgendwo im Code std::string schreibst, bedeutet dies du greifst in die std-Schublade rein, holst dir deinen String und tust ihn in deine Schublade.

    Wenn du aber using namespace std schreibst, dann nimmt du die ganze Schublade und kippst sie übern Tisch aus, nun ist der globale Namensbereich voll mit std-Zeugs.

    Nun musst du nicht mehr den Umweg über die std-Schublade machen, denn deine code-Schublade liegt genau unterm Tisch, du brauchst die Sachen nur reinzuschieben.

    Stell dir vor es würden keine Namespaces geben, dann würde dein Tisch ganz schön voll sein und einiges könnte auch gar nicht existieren denn ein Gegenstand darf nur einmal existieren, um das Problem zu lösen müsstest du einige Sachen dann abändern ( Namen ändern ).

    Jetzt hat aber jede Bibliothek ihren eigenen Namespace das heißt ihre eigene Schublade und nichts kommt sich in die Quere.

    Fazit:
    std:: -> Du greifst nur das gewünschte Element raus.
    using -> Du packst alles aus der Schublade raus und riskierst damit Konflikte.

    Wann du was benutzen solltest, lernst du noch in deinem Programmierleben 😉



  • David_pb schrieb:

    Wenn du using namespace xyz verwendest machst du den kompletten Inhalt des Namespace global bekannt. Mit anderen Worten, der Namespace macht keinen Sinn mehr.
    Using namespace untergräbt also im Grunde den Sinn von Namespaces

    Sorry, aber das ist eine grobe, und so pauschal falsche, Generalisierung. 'using namespace' untergräbt den Sinn von Namensbereichen überhaupt nicht. Es würde den Sinn nur dann untergraben, wenn man überall stets *alle* verfügbaren Namensbereiche per 'using namespace' einbindet. Solange man dies nicht tut (was in der Tat blödsinnig wäre), untergräbt es überhaupt nichts und stellt ein praktisches Werkzeug dar.

    /EDIT: KasF hat das ganz bildlich beschrieben. 🙂



  • Konrad Rudolph schrieb:

    Es würde den Sinn nur dann untergraben, wenn man überall stets *alle* verfügbaren Namensbereiche per 'using namespace' einbindet. Solange man dies nicht tut (was in der Tat blödsinnig wäre), untergräbt es überhaupt nichts und stellt ein praktisches Werkzeug dar.

    Hm, auf diesen Fall wollt ich eigentlich anspielen. Ich kenn z.B. nicht wenig Code in dem using namespace in Headern verwendet wird. Schade, dass das falsch rüber gekommen ist.

    Ich wollte nicht vermitteln das using namespace konkret, in jedem Fall, immer schlecht und falsch ist:

    Drum: Wenn using, dann selektiv. Ansonsten ist es besser den Namespace immer vor die jeweilige Funktionalität (...) zu schreiben.





  • Wer schreibfaul ist und auf die using Direktive nicht verzichten möchte, kann als Alternative zur using Deklaration auch lokale using Direktiven nutzen.

    void foo()
    {
        using namespace std;
    }
    

    So werden alle Bezeichner des std Namensraum lediglich im Gültigkeitsbereich der Funktion foo bekannt gemacht. Die sauberste Lösung wäre in den meisten Fällen aber auch hier using Deklarationen zu verwenden.



  • und was spricht gegen using std::string; ?



  • und warum hat sich das "using namespace std" bei vielen so eingebürgert?
    sind jetzt alle einfach schreibfaul?^^


  • Mod

    tridane schrieb:

    sind jetzt alle einfach schreibfaul?^^

    In Beispielcode sicherlich. Der gleiche Grund, der dazu führt, dass in Codebeispielen struct sehr viel häufiger verwendet wird als man das sonst erwarten würde.


Log in to reply