goto



  • hallo
    ich hab schon oft gehört das man sich oft gegen das goto eingesetzt hat.
    bisher habe ich aber nicht gelesen wieso das goto so schlimm sein sollte.
    hier ist das goto doch ziemlich praktisch:

    {
        foo = new foo();
        hres = foo->create();
        if ( FAILED(hres) ) goto fehler;
    
        hres = foo->barOne();
        if ( FAILED(hres) ) goto fehler;
    
        hres = foo->barTwo();
        if ( FAILED(hres) ) goto fehler;
    
        hres = foo->barThree();
        if ( FAILED(hres) ) goto fehler;
    
       // arbeite mit foo
    
       delete foo;
       return;
    
       fehler: 
       delete foo;
       throw Exception(hres)
    }
    

    ich bin zwar auch kein freund von goto, und bissher habe ich es noch nie eingetzt. im normalfall kann man das goto ja auch durch break oder sonstwas ersetzen. aber wenn es einfacher und auch nicht unübersichtlicher ist ein goto zu verwenden wieso sollte man es doch nicht tun ?



  • {
        std::auto_ptr<foo_t> foo = new foo_t;
        throw_if_failed(foo->create());
        throw_if_failed(foo->barOne());
        throw_if_failed(foo->barTwo());
        throw_if_failed(foo->barThree());
       // arbeite mit foo
    }
    




  • ja klar
    gib mir die zugriffsrechte auf deine festplatte
    am besten mit lese/schreibzugriff 🤡 🤡

    e: vorhin hattest du file://localhost....



  • @DEvent
    So kann man in C programmieren. Aber in C++ sorgt man eigentlich dafür, dass sich der Code selbst aufräumt, dafür gibt es SmartPointer und co. Das ist vorallem schon deswegen wichtig, wenn du Exception sicher programmieren willst.

    Siehe: GotW/Exceptional C++-Buch Serie, auto_ptr und boost::smart_ptr



  • enno-tyrant schrieb:

    schau dir dazu das mal an:

    http://www.cpp-tutor.de/cpp/le05/le05_01.htm#bedop

    ich brauch keine nachhilfe in c++, progge selbst schon über 3 jahren. ich wollt nur wissen wieso man kein goto benutzen sollte. wie gesagt ich kahm bisher immer gut ohne goto aus.



  • MFK schrieb:

    {
        std::auto_ptr<foo_t> foo = new foo_t;
        throw_if_failed(foo->create());
        throw_if_failed(foo->barOne());
        throw_if_failed(foo->barTwo());
        throw_if_failed(foo->barThree());
       // arbeite mit foo
    }
    

    was ist wenn man mit dieser blöden DX9 arbietet und mit foo->Release() arbeiten muss ? ein "delete d3dxMesh;" würd ich nicht machen....



  • DEvent schrieb:

    was ist wenn man mit dieser blöden DX9 arbietet und mit foo->Release() arbeiten muss ?

    Dann schreib dir eine Smartpointerklasse, die genau das macht. So schwierig ist das nicht.



  • Gotos sind deshalb schlecht, weil sie die Art wie dein Code durchlaufen wird drastisch ändern können. Du kannst jederzeit überall hin springen wo du grad lustig bist. Davon mal abgesehen sind sie so gut wie nirgends mehr nötig und wenn sie irgendwann mal abgeschafft werden (oder dein Team/Arbeitgeber dir ihre Verwendung verbietet) könntest du dumm da stehen.



  • Hallo,
    du sollst kein goto benutzen, wenn es eine bessere Alternative gibt, denn inflationär verwendet führt goto zu unstrukturiertem und unverständlichem Code.
    Moderne Programmiersprachen bieten für viele mögliche Anwendungsfälle von goto bessere Alternativen - Schleifen wie for, while, do-while, Verzweigungen wie if, switch, case, Funktionen, Exceptions und und und.

    Für deinen Beispielcode gibt es in C++ eine bessere Alternative als goto, nämlich RAII. Also solltest du dort kein goto benutzen.

    aber wenn es einfacher und auch nicht unübersichtlicher ist ein goto zu verwenden wieso sollte man es doch nicht tun ?

    Wenn ein goto den Code einfacher und übersichtlicher macht und das nicht nur daran liegt, dass dein Code sowieso schlecht strukturiert ist, dann spricht überhaupt nichts dagegen ein goto zu verwenden.
    Das Ziel ist einfacher und verständlicher Code, nicht die Vermeidung eines Sprachmittels auf Teufel komm raus.


Anmelden zum Antworten