你在C中注册一个回调函数是什么意思?

时间:2011-12-21 13:12:09

标签: c callback

任何人都可以通过一些例子在C中注册一个回调函数来告诉我我们究竟是什么意思吗?我在网上搜索了很多,但我得不到满意的答案。甚至在堆栈溢出中搜索,但无法得到完美的想法。

什么是通知回调和异步回调?

2 个答案:

答案 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_B
struct 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