Warum findet man in der WinAPI mehrstufige casts?



  • Ich frage nur aus Neugier, weil ich ab und zu in den WinAPI Headern solche casts sehe. Ein Beispiel:

    #define ListView_EnsureVisible(hwndLV, i, fPartialOK) \
        (BOOL)SNDMSG((hwndLV), LVM_ENSUREVISIBLE, (WPARAM)(int)(i), MAKELPARAM((fPartialOK), 0))
    

    Warum wird hier i zweimal gecastet?


  • Mod

    Wahrscheinlich soll das Compilerwarnungen verhindern. Kommt drauf an, was als i erwartet wird, und was genau ein WPARAM ist. Ich kenne mich mit WinAPI und Windows-Compilern nicht so aus, nur mit C 🙂

    Beim GCC würde beispielsweise ein Cast von einem Pointer zu int eine Warnung verursachen, wenn der Pointer eine größere size hat als ein int (was normalerweise so ist). Aber ein Cast von einem long int nach int wäre keine Warnung. Einen Pointer würde man daher warnungslos so zu einem int schrumpfen: (int)(unsigned long) pointer_value. Dieses Beispiel ist natürlich nicht sinnvoll und ein bisschen das Gegenteil von deinem Makro, aber ich weiß nicht genau, wann typische Windowscompiler warum warnen.

    Es ist auch möglich, dass er Autor dem Leser mitteilen möchte, dass die Funktion einen WPARAM-Parameter hat, obwohl der Wert von dem Makro zwischendurch in int gecasted wird (int ist kleiner als WPARAM, oder? Denn sonst macht der ganze Cast überhaupt keinen Sinn), auch wenn es technisch nicht notwendig wäre, weil es implizit gecastet würde.



  • @SeppJ

    Wahrscheinlich soll das Compilerwarnungen verhindern. Kommt drauf an, was als i erwartet wird, und was genau ein WPARAM ist. Ich kenne mich mit WinAPI und Windows-Compilern nicht so aus, nur mit C 🙂

    Das ist leider etwas generisch. Generell ist WPARAM ein unsigned int, kann aber je nach Nachricht bzw. Makro unterschiedliche Daten enthalten. Im konkreten Fall ist es ein int, für das Makro ListView_InsertMarkHitTest ist es ein Pointer auf eine POINT Struct und wird entsprechend mit (WPARAM)(LPPOINT)(point) gecastet. Wobei LPPOINT folgendermaßen definiert ist:

    typedef struct tagPOINT
    {
        LONG  x;
        LONG  y;
    } POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
    

    Es ist also ein etwas älterer Code.

    Es ist auch möglich, dass er Autor dem Leser mitteilen möchte, dass die Funktion einen WPARAM-Parameter hat, obwohl der Wert von dem Makro zwischendurch in int gecasted wird (int ist kleiner als WPARAM, oder? Denn sonst macht der ganze Cast überhaupt keinen Sinn), auch wenn es technisch nicht notwendig wäre, weil es implizit gecastet würde.

    So ein wenig kommt mir der Verdacht dass der Cast als Typ-Hinweis zu verstehen ist. Übrigens sind bei mir int und WPARAM gleich groß. Aber der Code ist wie gesagt uralt (FAR Pointer). Wo daher könnte das auch noch von Zeiten stammen, wo 16 Bit im Trend war.


  • Mod

    @Quiche-Lorraine sagte in Warum findet man in der WinAPI mehrstufige casts?:

    Wo daher könnte das auch noch von Zeiten stammen, wo 16 Bit im Trend war.

    Dann kann es auch gut sein, dass die Ursache heute gar nicht mehr nachvollziehbar ist, weil es sich vielleicht auf eine Compilerdiagnose von damals bezieht.


Anmelden zum Antworten