C Cast in C++ umsetzen



  • Hi,

    wie setze ich am besten die C Casts wie

    (HBRUSH)GetStockObject(WHITE_BRUSH)
    

    in C++ um?

    Einfach so lassen oder als reinterpret_cast?



  • Diesem kurzen Code-Fetzen kann man nicht ansehen, was da eigentlich passiert. Was ist denn HBRUSH für ein Typ und was liefert die Funktion (oder der Funktor) GetStockObject genau zurück?

    Der C-Style Cast macht einfach je nach Situation etwas anderes. In einigen Situationen ist er äquivalent zu static_cast, in anderen zu const_cast, in anderen zu reinterpret_cast. Das kommt ganz drauf an.



  • Das ist ja gerade der Witz an den "C++ Casts", also soundso_cast<Typ>(...), dass Du damit genau sagen kannst, was eigentlich passieren soll.



  • Ich weiß nicht, ob man das 100%ig allgemein sagen kann, aber const_cast kommt in C ja praktisch nicht vor, dynamic_cast gibts gar nicht und reinterpret_cast hat eigentlich immer eine Form wie *(Type*)&lvalue . Also bleibt nur static_cast als Allerweltscast für den ganzen Rest.



  • Es geht hierbei um das Füllen der Fensterstruktur der WinAPI,

    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    

    GetStockObject liefert ein GDI-Objekt zurück das halt entsprechend gecastet werden kann.



  • krümelkacker schrieb:

    Diesem kurzen Code-Fetzen kann man nicht ansehen, was da eigentlich passiert. Was ist denn HBRUSH für ein Typ und was liefert die Funktion (oder der Funktor) GetStockObject genau zurück?

    Das ist ja gerade das Problem bei diesen ganzen Handles im WinAPI... Der eigentliche Typ wird hinter einem #define oder typedef versteckt, und ist meines Wissens nichtmal dokumentiert (wenn man nicht in die entsprechenden Header-Files guckt).

    Ich würde den Code so lassen. Ein static_cast wäre zwar richtig, trägt in diesem Fall aber nicht zur Lesbarkeit bei. Und wenn man ein C-API benutzt sollte es auch erlaubt sein, eigentlich "unschöne" C-Sprachkonstrukte zu verwenden.



  • Bashar schrieb:

    reinterpret_cast hat eigentlich immer eine Form wie *(Type*)&lvalue .

    Nein, das kann man so nicht sagen. Ein Reinterpret_cast kann auch zwischen Zeigern und Ganzzahlen wandeln. Und Zeigertypen können ja auch hinter Typedefs versteckt werden. Der Code des OPs kann so ziemlich alles machen, je nachdem, was die Funktion liefert und was HBRUSH sein soll.

    Bashar schrieb:

    Also bleibt nur static_cast als Allerweltscast für den ganzen Rest.

    Man kann es zumindest mit einem static_cast zuerst probieren. Wenn das dann nicht kompiliert, ist dann reinterpret_cast wahrscheinlich der richtige.



  • Die Typen sind hier dokumentiert. Es handelt sich dabei um Zeiger auf void.

    Dementsprechend böte sich da ein einfacher static_cast an.



  • GetStockObject gibt ein void* zurück, kann also zu jedem beliebigen Zeiger gecastet werden.



  • seldon schrieb:

    Die Typen sind hier dokumentiert. Es handelt sich dabei um Zeiger auf void.

    Dementsprechend böte sich da ein einfacher static_cast an.

    Super danke, you made my day 🙂


Anmelden zum Antworten