Callback-Funktionen sind Funktionen, deren Adresse als Argument an eine andere Funktion übergeben wird. Dies ermöglicht die Implementierung von Ereignis-Handlern, benutzerdefinierten Algorithmen und Plugins.
Deklaration einer Callback-Funktion:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // Aufruf des Callbacks } void handler(int n) { printf("Zahl verarbeitet: %d\n", n); } int main() { process(handler); return 0; }
Tipps:
Kann eine Funktion mit nicht übereinstimmender Signatur als Callback übergeben werden?
Häufig falsche Antwort: „Ja, C erlaubt das, wenn ein explizites Typ-Casting durchgeführt wird.“
Richtige Antwort: Obwohl das formale Casting möglich ist, führt der Aufruf einer solchen Funktion zu unvorhersehbarem Verhalten – falsche Werte können an die Parameter übergeben werden, der Stack kann beschädigt werden.
Beispiel für Gefahr:
typedef void (*cb_t)(int); void wrong_cb(double d) { printf("%f\n", d); } void call(cb_t f) { f(123); } int main() { call((cb_t)wrong_cb); } // GEFÄHRLICH: Signaturen unterscheiden sich
Geschichte
Geschichte
Geschichte
Bei der Entwicklung eines plattformübergreifenden Systems hat der Autor die Calling Convention für Callback-Funktionen falsch festgelegt. Dies trat unter einem bestimmten Betriebssystem nicht auf, führte jedoch zu einem Programmabsturz unter einem anderen Betriebssystem, wenn Callbacks aus einer C-Bibliothek aufgerufen wurden.