Frage zu typedef bool (callback *mycallback)



  • Hi,

    ich bin auf folgendes typedef gestoßen:

    typedef BOOL (CALLBACK *MYCALLBACK)(INT*, INT*, LPVOID);
    

    Was hat das CALLBACK in der ersten Klammer zu bedeuten?

    MfG
    Scarabol



  • Edit: Hier stand Unsinn.



  • Falsch.
    Es geht um die Calling-Convention:

    #define CALLBACK    __stdcall
    

    Default ist bei MSVC Compilern __cdecl, d.h. das Makro erfüllt sehr wohl einen Zweck.



  • Hi,

    kannst du das etwas detailierter erklären? Ich versteh nicht was das Makro bewirken soll?

    MfG
    Scarabol



  • Die Calling-Convention definiert, wie ein Funktionsaufruf zu erfolgen hat, z.B. wie Parameter übergeben werden, wie der Returnwert zurückgegeben wird etc.

    Wenn du ohne Angabe eine Calling-Convention eine Funktion oder einen Funktionszeiger definierst, dann wird die Default-Calling-Convention genommen, und die ist bei MSVC eben "cdecl".

    Da es sich auf Windows Plattformen eingebürgert hat, als Calling-Convention für Callback Funktionen nicht "cdecl" sondern "stdcall" zu verwenden, muss man das bei einer Callback-Funktion auch angeben, sonst nimmt der Compiler per Default das falsche. Genauso bei Funktionszeigern für Callback-Funktionen.

    In ein Makro verpackt wird das ganze dann, weil Microsoft auf anderen Plattformen (Mac, ...) z.T. die selben Header-Files verwendet. Die Compiler dieser Plattformen kennen dann u.U. kein "__stdcall". Auf Mac ist CALLBACK z.B. als "_pascal" definiert. Das Makro CALLBACK kann man so überall verwenden, wo man eine Callback Funktion definiert, oder einen Zeiger für eine Callback-Funktion. Ohne wissen zu müssen, ob nun __stdcall oder _cdecl oder __was_weiss_ich die Calling-Convention für Callbacks ist.



  • Wenn ich jetzt eine Funktion hab die als Callback dient und eine die den Callback erhalten soll also:

    BOOL mycallback(INT *, INT *, LPVOID);
    
    // func(MYCALLBACK call);
    func(mycallback);
    

    Hier bekomme ich trotzdem einen Fehler, also wie muss ich mycallback richtig deklarieren?
    Bzw. Wie kann ich mycallback als __stdcall deklarieren?

    MfG
    Scarabol



  • Mit

    BOOL CALLBACK mycallback(INT *, INT *, LPVOID);
    

    Oder auch

    BOOL __stdcall mycallback(INT *, INT *, LPVOID);
    

    (Ist aber in dem Fall weniger zu bevorzugen)


Anmelden zum Antworten