Регистрация обратного вызова означает передачу указателя на функцию тому, кто будет вызывать вашу функцию через указатель
Для облегчения понимания Рассмотрим A и B, которые являются двумя сущностями, вовлеченными в код,A написал функцию, скажем, myFunc
char myFunc(int a)
{
/* Code written by A*/
}
Теперь, когда сказано, что A зарегистрирует обратный вызов с помощью B, это означает, что A отправит указатель функции на B Посылая указатель функции на B, A обеспечивает доступк функции
Для регистрации обратного вызова будет функция, в которой A может передать указатель A, вызовет функцию как
cb_register(myFunc);
// Passed the address of Function
Эта функция cb_register определена в B как
typedef void (*cb_fn_ptr)(int a);
void cb_register(cb_fn_ptr cb)
{
// In this function B can store the address in a structure member
}
Например, объявляется struct_B, в которой хранится
struct s_B {
cb_fn_ptr cb;
// cb will have address whenever B
};
B, хранящий адрес (на который указывает указатель функции) и который может использовать его для последующего вызова функции.
Когда B вызывает функцию через указатель на функцию, она вызывается как callback. B просто нужно знать прототип функции для вызова функции и может совершенно не знать, что делает функция.В этом случае функция будет вызываться как
struct s_B temp;
char ret_val;
int arg_val;
ret_val = temp->cb(arg_val)
//This is a callback