что вы подразумеваете под регистрацией функции обратного вызова в C? - PullRequest
7 голосов
/ 21 декабря 2011

Может ли кто-нибудь сказать мне, что именно мы подразумеваем под регистрацией функции обратного вызова в C с некоторыми примерами? Я много искал в сети, но не мог получить удовлетворительные ответы. Даже искал в переполнении стека, но не смог получить идеальное представление об этом.

Что такое обратные вызовы уведомлений и асинхронные обратные вызовы?

Ответы [ 2 ]

13 голосов
/ 21 декабря 2011

Регистрация функции обратного вызова просто означает, что вы организуете для внешнего объекта вызов вашей функции.

Это может произойти позже или сразу же.Простой пример - qsort.Он объявлен так:

void qsort(void *base, size_t nel, size_t width,
       int (*compar)(const void *, const void *));

Чтобы использовать его, вы должны передать указатель на функцию, которая сравнивает элементы - обратный вызов.

Это был простой пример, но в целом "«регистрация обратного вызова» означает передачу указателя на функцию тому, кто вызовет ее для вас в будущем.

1 голос
/ 15 июня 2018

Регистрация обратного вызова означает передачу указателя на функцию тому, кто будет вызывать вашу функцию через указатель

Для облегчения понимания Рассмотрим 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...