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 __stdcallDefault 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)