Funkcje zwrotne (callback) to funkcje, których adres jest przekazywany jako argument innej funkcji. Pozwala to na realizację obsługi zdarzeń, algorytmów użytkownika i wtyczek.
Deklaracja funkcji callback:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // wywołanie callback } void handler(int n) { printf("Przetworzone liczba: %d\n", n); } int main() { process(handler); return 0; }
Wskazówki:
Czy można przekazać funkcję o niezgodnej sygnaturze jako callback?
Częsty błędny odpowiedź: „Tak, C pozwoli, jeśli zadeklarujesz jawne rzutowanie typu”.
Poprawna odpowiedź: Chociaż formalne rzutowanie jest możliwe, wywołanie takiej funkcji prowadzi do niezdefiniowanego zachowania — parametry mogą otrzymywać nieprawidłowe wartości, stos ulegnie uszkodzeniu.
Przykład niebezpieczeństwa:
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); } // NIEBEZPIECZNE: sygnatury różnią się
Historia
Historia
Historia
Podczas opracowywania systemu wieloplatformowego autor niewłaściwie określił konwencję wywołania dla funkcji callback. Nie ujawniało się to w jednym systemie operacyjnym, ale prowadziło do awarii programu w innym przy wywołaniu callbacków z biblioteki C.