Was bedeutet "#INF"



  • camper schrieb:

    ich hab noch eine:

    time = (need - have) / double(prod) / 3600.0;
    

    alle drei varianten haben dieselbe bedeutung.

    aber meine ist die einzige, die unter c wie auch unter c++ funzt 😉


  • Mod

    net schrieb:

    camper schrieb:

    ich hab noch eine:

    time = (need - have) / double(prod) / 3600.0;
    

    alle drei varianten haben dieselbe bedeutung.

    aber meine ist die einzige, die unter c wie auch unter c++ funzt 😉

    relevanz? 😉



  • GPC schrieb:

    Er verwendet die C++ Casts, während du noch mit den C Casts rumgurkst, unnötigerweise. Die C++ Casts haben den Vorteil, dass es für jeden Zweck einen gibt (static, dynamic, reinterpret, const)...

    ich glaube dass die meisten c++ casts verwenden, nur weil's schicker/neuer/schöner aussieht. kennst du ein beispiel das nur mit c++ casts funktioniert und mit c casts nicht?



  • Alle dynamic_casts?!


  • Mod

    fast. alle dynamic_casts, die einen polymorphen typ benötigen. es war ja nie der sinn der 'neuen' cast syntax, neue konvertierungen einzuführen. die, die wir haben, bereiten schon genug kopfzerbrechen.



  • net schrieb:

    GPC schrieb:

    Er verwendet die C++ Casts, während du noch mit den C Casts rumgurkst, unnötigerweise. Die C++ Casts haben den Vorteil, dass es für jeden Zweck einen gibt (static, dynamic, reinterpret, const)...

    ich glaube dass die meisten c++ casts verwenden, nur weil's schicker/neuer/schöner aussieht.

    Nun ja, ich fand die neuen Casts zu Beginn ja echt hässlich, inzwischen geht's einigermaßen. Daran liegt's wohl eher nicht. Und wenn ich ehrlich bin, verwende ich schon C++ Sprachmittel, wenn's welche gibt. Warum auch nicht? Ich programmiere ja schließlich C++ und nicht C (Äquivalent zu dieser Situation wäre die #define und const Geschichte).

    kennst du ein beispiel das nur mit c++ casts funktioniert und mit c casts nicht?

    Die Frage wurde ja bereits beantwortet. Sie sind einfach klarer im Vergleich zu C Casts. Siehe auch Lektion 2 von MEC++ von Scott Meyers.

    MfG

    GPC



  • GPC schrieb:

    Er verwendet die C++ Casts, während du noch mit den C Casts rumgurkst, unnötigerweise. Die C++ Casts haben den Vorteil, dass es für jeden Zweck einen gibt (static, dynamic, reinterpret, const). Das macht klar, wie gecastet werden soll (was auch die Fehlersuche erleichtern dürfte), ein C Cast hingegen castet irgendwie.
    Daher: In C++ die neuen Casts verwenden!

    Genau deswegen.



  • Vielleicht erbarmt sich doch mal jemand und schreibt einen FAQ Beitrag... 😉

    Greetz, Swordfish



  • GPC schrieb:

    kennst du ein beispiel das nur mit c++ casts funktioniert und mit c casts nicht?

    Die Frage wurde ja bereits beantwortet. Sie sind einfach klarer im Vergleich zu C Casts. Siehe auch Lektion 2 von MEC++ von Scott Meyers.

    aber kann nicht mal jemand einen codebeispiel posten, das nur mit c++-casts geht und mit c-casts z.b. abstürzt oder sich anders verhält?



  • class a
    {
        public:
    
            virtual ~a() {}
    };
    
    class b : public a
    {
    
    };
    
    class c : public a
    {
    
    };
    
    void test()
    {
        b B;
        a *A = &B;
    
        // C-Cast: undefiniertes Verhalten
        c *C = (c *) A;
    
        // C++ Cast: 0-Zeiger wird zurückgegeben
        c *C = dynamic_cast<c *> (A);
    }
    


  • danke.
    geht aber nur wen rtti enabled ist, sonst stürzt es ab beim dynamic_cast (bei mir zumindestens). also einen dynamic_cast kann man nicht durch c-casts ersetzen, aber wie ist es z.b. mit static_cast und reinterpret_cast? habt ihr dafür auch beispiele, die zeigen dass man sie in c++ nicht durch c-casts ersetzen kann?


  • Mod

    net schrieb:

    habt ihr dafür auch beispiele, die zeigen dass man sie in c++ nicht durch c-casts ersetzen kann?

    es gibt ein paar seltene fälle. nähmlich dann wenn ein static_cast oder ein reinterpret_cast erlaubt wären (in dem falle verhält sich C-cast wie ein static_cast) und wir ein reinterpret_cast benötigen.

    // wir wollen viele verschieden (POD-)Ts binär in einem stream speichern. weil das ewige gecaste beim user unschön ist, schreiben wir eine template-klasse. verschiedene versionen:
    // 1 (C-style cast über pointer)
    template<typename T>
    bool write_binary(std::ostream& s, const T& arg)
    {
        return s.write( (const char*)&arg, sizeof arg );
    };
    
    // 2 (reinterpret_cast über pointer)
    template<typename T>
    bool write_binary(std::ostream& s, const T& arg)
    {
        return s.write( reinterpret_cast< const char* >( &arg ), sizeof arg );
    };
    
    // 3 (C-style cast über array)
    template<typename T>
    bool write_binary(std::ostream& s, const T& arg)
    {
        return s.write( (const char (&)[sizeof arg])arg, sizeof arg );
    };
    
    // 4 (static_cast über array)
    template<typename T>
    bool write_binary(std::ostream& s, const T& arg)
    {
        return s.write( static_cast< const char (&)[sizeof arg] >( arg ), sizeof arg );
    };
    
    // 5 (reinterpret_cast über array)
    template<typename T>
    bool write_binary(std::ostream& s, const T& arg)
    {
        return s.write( reinterpret_cast< const char (&)[sizeof arg] >( arg ), sizeof arg );
    };
    

    varianten 1 und 2 funktionieren, vorausgesetzt, T hat keinen falsch überladenen & operator - das wird wohl meist der fall sein, aber wenn wir können, sollten wir versuchen, nicht davon abhängig zu sein. variante 4 funktioniert nur, wenn T einen passenden konvertierungsoperator hat (oder zufällig mal bereits so ein array ist). variante 5 wird immer das tun, was wir wollen. und variante 3 entspricht variante 4, wenn diese zulässig ist (wir wissen aber nicht, was der konvertierungsoperator in 4 anstellt, wenn er existiert), sonst variante 5. dieser schleichende bedeutungswandel spricht in solchen fällen immer gegen C-style casts.



  • Ein weiterer Vorteil wäre, das c++-casts schneller zu finden / leichter zu erkennen sind.



  • demnach sind gibt es also die c++ casts, um mit mehrdeutigkeiten klarzukommen. naja, c++ hat ja ohne ende mit mehrdeutigkeiten zu kämpfen (man denke da nur an überladene operatoren usw...). jetzt ist mir einiges klarer. danke camper, gutes beispiel 👍


Anmelden zum Antworten