任何人都可以通过一些例子在C中注册一个回调函数来告诉我我们究竟是什么意思吗?我在网上搜索了很多,但我得不到满意的答案。甚至在堆栈溢出中搜索,但无法得到完美的想法。
什么是通知回调和异步回调?
答案 0 :(得分:12)
注册回调函数只是意味着您正在安排外部实体来调用您的函数。
可能会在以后发生,或者可能会立即发生。一个简单的例子是qsort
。声明如下:
void qsort(void *base, size_t nel, size_t width,
int (*compar)(const void *, const void *));
要使用它,必须将指针传递给比较元素的函数 - 回调。
这是一个简单的例子,但通常“注册回调”意味着将函数指针传递给将来会为你调用它的人。
答案 1 :(得分:1)
注册回调意味着将函数指针传递给将通过指针调用函数的函数指针
为了便于理解考虑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_Bstruct s_B {
cb_fn_ptr cb;
// cb will have address whenever B
};
B存储了地址(函数指针指向的地址),可以用它来稍后调用该函数。
当B通过函数指针调用函数时,它被称为回调。 B只需要知道函数的原型来调用函数,并且可以完全不知道函数的作用。 在这种情况下,函数将调用为
struct s_B temp;
char ret_val;
int arg_val;
ret_val = temp->cb(arg_val)
//This is a callback