最简单的回调函数类型为无参数,无返回值的函数。最简单的回调函数的格式即是这种形式。其类型定义如下所示:
typedef void (*T_SIMPLE_CALL)(void )
在以下的例子中,回调函数为simple_callback,这个函数没有参数和返回值,只是简单的调用了printf打印信息,它的定义如下所示:
void simple_callback(void )
{
printf(“++++++++++++++++simple callback++++++++++\n”);
return;
}
使用回调函数的函数为:test_simple_callback,这个函数包含了一个参数,即回调函数的指针,它的定义如下所示:
void test_simple_callback(T_SIMPLE_CALLBACK p_simple_callback)
{
printf(“======================test_simple_callbackBegin ========\n”);
if(p_simple_callback)
{
(*p_simple_callback)();//通过指针调用回调函数
}
else
{
printf(“---------------no_callback------------\n”);
}
printf(“======================test_simple_callback End ========\n”);
return;
}
在调用test_simple_callback的过程中,可以有两种调用形式,第一种是不传递回调函数的指针,例如:
int main(int argc,char *argv[])
{
test_simple_callback(NULL);
return0;
}
调用的结果如下所示:
======================test_simple_callbackBegin ========
---------------no_callback------------
======================test_simple_callbackEnd ========
事实上,回调函数的调用者test_simple_callback对传入的参数是否为空作出了判断,在没有传递回调函数指针的情况下,直接跳过了调用回调函数过程。
注意:在使用回调函数的过程中,程序一般支持不使用回调函数的情况,即将回调函数指针设置为NULL。
第二种使用回调函数的调用方式是在调用test_simple_callback的过程中将回调函数的指针传递下去,例如:
Int main(int argc,char *argv[])
{
T_SIMPLE_CALL p_simple_callback=simple_callback;
test_simple_callback(p_simple_callback);
return 0;
}
此时,调用的结果如下所示:
======================test_simple_callbackBegin ========
++++++++++++++++simple callback++++++++++
======================test_simple_callbackEnd ========
从上述结果可以看出,在test_simple_callback函数的运行过程中,实际上通过参数传递进来的函数指针调用了simple_callback。总体的执行关系为:mainàtest_simple_callbackàsimple_callback 。从软件模块的角度来看,main函数和simple_callback函数应该属于上层软件模块,而test_simple_callback应属于下层软件模块。在上层模块调用下层模块的函数test_simple_callback的时候,将回调函数的指针作为参数传入,在test_simple_callback执行的过程中,调用了这个回调函数(simple callback)。这个过程如下图所示:
注意:函数test_simple_callback代表了下层的函数,它和一般函数没有任何区别,也可以使用更多的参数,这里主要特点是使用了一个参数作为回调函数的指针。本例为了突出说明回调函数的调用,仅使用了一个参数。
上面,仅仅通过一个简单的例子演示了回调函数的调用方法,事实上,这种既没有参数也没有返回值的回调函数,既不能向上层传递信息,也不能干预下层模块的运行。本例中从打印出来的信息中判断了回调函数已经被调用。在实际的应用中,这种形式可以用于对上层简单的调用处理,也可以使用上层的静态变量完成计数等工作。
回调函数的作用:
函调函数的表现形式是一个某种类型的函数指针,这个函数由上层的软件模块实现,将这个函数指针通过某种形式传递给下层的软件模块,由下层软件模块在某个时刻调用这个函数。函数指针的本质是一个函数的地址,在32位的C语言系统中,本质上就是一个32位无符号的整型数。函数指针由上层软件模块到下层软件模块的传递方式可以是通过作为函数的参数传递,也可以是使用结构体的成员进行传递。调用回调函数的时刻一般有两种:
一种是在上层模块调用的下层模块中,直接调用回调函数;
另一种是使用注册的方式,在某个事件发生的时候下层模块调用回调函数。