Le funzioni di callback (callbacks) sono funzioni il cui indirizzo viene passato come argomento a un'altra funzione. Questo consente di implementare gestori di eventi, algoritmi personalizzati e plugin.
Dichiarazione di una funzione callback:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // chiamata della callback } void handler(int n) { printf("Numero elaborato: %d\n", n); } int main() { process(handler); return 0; }
Suggerimenti:
È possibile passare una funzione con una firma non corrispondente come callback?
Risposta errata comune: «Sì, C lo permetterà se dichiari un esplicito casting».
Risposta corretta: Anche se il casting formale è possibile, la chiamata di tale funzione porterà a comportamenti indefiniti — valori errati possono essere passati ai parametri, lo stack potrebbe essere danneggiato.
Esempio di pericolo:
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); } // PERICOLO: le firme differiscono
Storia
Storia
Storia
Durante lo sviluppo di un sistema cross-platform, l'autore ha definito in modo errato la calling convention per le funzioni callback. Questo non si manifestava in un sistema operativo, ma portava al crash del programma su un altro durante la chiamata di callback dalla libreria C.