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.


Anmelden zum Antworten