Was ist der Unterschied zwischen einer Funktion und einer CALLBACK Funktion?



  • Hallo,

    der Titel dieses Beitrags trägt bereits meine Frage:

    Was ist der Unterschied zwischen einer Funktion und einer CALLBACK Funktion?

    Ich hoffe hier endlich antworten zu erhalten.

    Danke!



  • Technisch: Gar keiner.

    Inhaltlich: Die Art, wie sie verwendet wird.

    • Eine normale Funktion rufst du direkt auf. Punkt.
    • Eine Callback-Funktion übergibst du (in Form eines Funktionszeigers) an jemand anderen, der sie dann aufrufen kann (für Rückmeldungen etc).


  • habe ebn n blick in den windef.h header geworfn, da steht eigentlich, dass das CALLBACK define bei windows entweder komplett weggelassen oder durch __stdcall ersetzt wird. Das teil scheint ja ebenfalls für MAC-os definiert zu sein, das ist also imho einfach so ein define, mit dem man code für verschiedene betriebssysteme verwenden kann oder so ähnlich... aber __stdcall ist doch eine "ganz normale funktion" oder? was hat es denn mit funktionszeigern zu tun?



  • __stdcall, __cdecl etc sind verschiedene Aufrufkonventionen - die unterscheiden sich in der Art, wie die Funktionsparameter vorbereitet werden (und wer dafür zuständig ist, den Aufrufstack zu säubern). Deswegen sagte ich ja, daß es technisch keinen Unterschied gibt 😉

    Und der inhaltliche Unterschied ist die Art, wie du die Funktionen einsetzt (und das kann sich durchaus miteinander mischen). Callback-Funktionen werden verwendet, damit eine Biliotheksfunktion sich im laufenden Betrieb zurückmelden kann. (z.B. der SetTimer() gibst du eine Funktion mit, die bei Zeitablauf gerufen werden soll - sowas ist ein "Callback")



  • ... aber __stdcall ist doch eine "ganz normale funktion" oder? was hat es denn mit funktionszeigern zu tun?

    Stdcall ist nur eine Aufrufkonvention. Beim Funktionsaufruf werden Parameter uebergeben, diese werden bei unterschiedlichen Aufrufkonventionen in unterschiedlicher Reihenfolge uebergeben (von rechts nach links oder links nach rechts). Zusaetzlich wird der Funktionsname unter Umstaenden angepasst (bei c-call [cdecl] z.B. Unterstrich davor). Sie bestimmt ausserdem, wer den Stack bereinigt.

    Genaugenommen ist jede Funktion ja nur ein Zeiger auf einen Speicherbereich, an dem der auszuführende Code liegt. Es werden die Parameter und die Ruecksprungadresse abgelegt (Stack oder ggf Register), hingesprungen, Code ausgefuehrt und zurueckgesprungen.

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten