Функции обратного вызова (callbacks) — это функции, адрес которых передается как аргумент другой функции. Это позволяет реализовать обработчики событий, пользовательские алгоритмы и плагины.
Объявление callback-функции:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // вызов callback } void handler(int n) { printf("Обработано число: %d ", n); } int main() { process(handler); return 0; }
Советы:
Можно ли передавать функцию с несовпадающей сигнатурой в качестве callback-а?
Частый ошибочный ответ: «Да, C позволит, если объявить явное приведение типа».
Правильный ответ: Хотя формальное приведение возможно, вызов такой функции приведёт к неопределённому поведению — параметрам могут быть переданы неверные значения, стек испортится.
Пример опасности:
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); } // ОПАСНО: сигнатуры различаются
История
История
История
При разработке кросс-платформенной системы автор неверно определил calling convention для callback-функций. Это не проявлялось на одной ОС, но приводило к краху программы на другой при вызове callback-ов из Си-библиотеки.