cerr oder doch cout



  • const int NULL = 0 ; // Weil Stroustrup es so will
    
    if ( pointer == NULL )
        cerr << "FAIL" << endl ;
    
    if ( pointer == NULL )
        cout << "FAIL" << endl ;
    

    Welche Methode bevorzugt ihr? Ich verstehe die Trennung überhaupt nicht.
    Landen sowieso nicht alle Ausgaben auf der Konsole ( stdout ) ?
    Oder gibt es einen guten Grund Fehlerausgaben auf stderr umzuleiten?



  • Bjarn´s Cousin 123213213° schrieb:

    const int NULL = 0 ; // Weil Stroustrup es so will
    
    if ( pointer == NULL )
        cerr << "FAIL" << endl ;
    
    if ( pointer == NULL )
        cout << "FAIL" << endl ;
    

    Welche Methode bevorzugt ihr? Ich verstehe die Trennung überhaupt nicht.
    Landen sowieso nicht alle Ausgaben auf der Konsole ( stdout ) ?
    Oder gibt es einen guten Grund Fehlerausgaben auf stderr umzuleiten?

    Im Gegensatz zu std::cout besitz std::cerr keinen Puffer. Es wird also nicht "gewartet" bis der Puffer voll genug ist sondern sofort auf die Konsole geschrieben. Das kann bei Fehlermeldungen entscheidend sein.

    Stell dir vor dein Programm erkennt einen Fehler und schreibt ihn nicht, weil der Puffer in dem Moment nicht voll genug ist. Bei std::cerr kann das nicht passieren, da eben sofort geschrieben wird.



  • sehr gut !
    danke für die antwort!



  • Bjarn´s Cousin 123213213° schrieb:

    const int NULL = 0 ; // Weil Stroustrup es so will
    

    Du weisst aber, dass es in der Standardbibliothek ein Makro NULL gibt? Und ich habe gedacht, Stroustrup schreibt lieber 0 statt NULL ... 😉



  • Nexus schrieb:

    Bjarn´s Cousin 123213213° schrieb:

    const int NULL = 0 ; // Weil Stroustrup es so will
    

    Du weisst aber, dass es in der Standardbibliothek ein Makro NULL gibt? Und ich habe gedacht, Stroustrup schreibt lieber 0 statt NULL ... 😉

    In "C++ the programming language" steht, dass die Verwendung von dem Makro NULL unschön ist.



  • Bjarn´s Cousin 123213213° schrieb:

    Nexus schrieb:

    Bjarn´s Cousin 123213213° schrieb:

    const int NULL = 0 ; // Weil Stroustrup es so will
    

    Du weisst aber, dass es in der Standardbibliothek ein Makro NULL gibt? Und ich habe gedacht, Stroustrup schreibt lieber 0 statt NULL ... 😉

    In "C++ the programming language" steht, dass die Verwendung von dem Makro NULL unschön ist.

    Sich dieses NULL aber "nachzubauen" ist alles andere als sinnvoll. Es kann sogar zu Problem führen, da es als Makro schon existiert.

    dann müsstest du schon schreiben:

    #ifdef NULL
    #undef NULL
    #endif
    const int NULL = 0;
    

    Sonst passierts dir vielleicht, dass der Präprozessor daraus etwas ähnliches wie macht:

    const int (void *) 0 = 0;
    


  • Oh, das wusste ich garnicht, dass bet cout erst gewartet wird. Deswegen will mir das bei linux nicht immer raus o.o thanks



  • Bjarn´s Cousin 123213213° schrieb:

    Oder gibt es einen guten Grund Fehlerausgaben auf stderr umzuleiten?

    Wenn andere Programme dein Programm als Prozess starten können sie error und out streams unterschiedlich einlesen und wissen, ob dein Programm nen Error oder ne normale Ausgabe gemacht hat, ohne dass sie den Text verstehen müssen.



  • Zum Thema "Ein-/Ausgaben umleiten" bzw. kurz "Piping" hier noch ein Link (die Operatoren funktionieren auch in einer DOS-Box):
    http://www.selflinux.org/selflinux/html/bash_basic03.html#d25e453

    Man kann dann also cout- und cerr-Ausgaben getrennt behandeln (auch wenn standardmäßig cerr-Ausgaben auch direkt auf die Konsole geschickt werden).



  • lk schrieb:

    Oh, das wusste ich garnicht, dass bet cout erst gewartet wird. Deswegen will mir das bei linux nicht immer raus o.o thanks

    Übrigens gibt std::endl nicht nur einen Zeilenumbruch aus, sondern leert auch den Puffer. Schreibst du also:

    std::cout << "blub" << std::endl;
    

    Dann sollte die Ausgabe auch erscheinen.


Anmelden zum Antworten