Les fonctions de rappel (callbacks) sont des fonctions dont l'adresse est passée comme argument à une autre fonction. Cela permet de réaliser des gestionnaires d'événements, des algorithmes personnalisés et des plugins.
Déclaration d'une fonction callback :
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // appel callback } void handler(int n) { printf("Nombre traité : %d ", n); } int main() { process(handler); return 0; }
Conseils :
Peut-on passer une fonction avec une signature non correspondante comme callback ?
Réponse erronée fréquente : « Oui, C le permettra si vous déclarez un cast explicite ».
Réponse correcte : Bien que le cast formel soit possible, appeler une telle fonction entraînera un comportement indéfini - des valeurs incorrectes peuvent être passées aux paramètres, la pile peut être corrompue.
Exemple de danger :
typedef void (*cb_t)(int); void wrong_cb(double d) { printf("%f ", d); } void call(cb_t f) { f(123); } int main() { call((cb_t)wrong_cb); } // DANGEREUX : les signatures divergent
Histoire
Histoire
Histoire
Lors du développement d'un système multiplateforme, l'auteur a mal défini la convention d'appel pour les fonctions callback. Cela ne se manifestait pas sur un système d'exploitation, mais entraînait un crash du programme sur un autre lors de l'appel des callbacks depuis une bibliothèque C.