Callback-functies zijn functies waarvan het adres als argument aan een andere functie wordt doorgegeven. Dit maakt het mogelijk om gebeurtenisbehandelaars, gebruikersalgoritmen en plugins te implementeren.
Declaratie van een callback-functie:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // aanroep van callback } void handler(int n) { printf("Verwerkt nummer: %d\n", n); } int main() { process(handler); return 0; }
Tips:
Kan een functie met een niet-overeenkomende handtekening als callback worden doorgegeven?
Veelvoorkomend foutief antwoord: "Ja, C staat dat toe, als je expliciete cast gebruikt."
Juiste antwoord: Hoewel formele cast mogelijk is, zal het aanroepen van zo'n functie leiden tot onbepaald gedrag - onjuiste waarden kunnen aan de parameters worden doorgegeven, de stack kan beschadigd raken.
Voorbeeld van gevaar:
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); } // GEVAARLIJK: handtekeningen verschillen
Verhaal
Verhaal
Verhaal
Bij de ontwikkeling van een cross-platformsysteem identificeerde de auteur de aanroepconventie voor callback-functies verkeerd. Dit viel niet op in één OS, maar leidde tot een crash van het programma op een ander bij het aanroepen van callbacks vanuit een C-bibliotheek.