项目中,回调函数好像是一个必须使用的东东,之前有点晕,现在逐渐明白了,有必要梳理一下。
一般应用的场景是这样的,在某个网络端口或通信串口时,将一个函数FunA作为参数传递给那个网络模块和通信模块(DLL库)的打开函数。在某个条件下,比如收到来自网络的数据时,FunA就会响应。这个FunA就是回调函数。(待续)
什么是回调函数?
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针做为参数传递给另一个函数,当这个指针被用来调用其指向的函数时,我们就说这是回调函数。
回调函数的使用机制是怎样的?
1) 定义一个回调函数;
2) 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
3) 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
所以正确的使用回调函数需要理解函数指针。
什么是函数指针?
函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。
如:
void Invoke(char* s) { printf(s); }
void Invoke(char* s);
int main() { void (*fp)(char* s); //声明一个函数指针(fp) fp=Invoke; //将Invoke函数的入口地址赋值给fp fp("Hello World!\n"); //函数指针fp实现函数调用 return 0; }
实际中,为了方便,通常用宏定义的方式来声明函数指针,实现程序如下:
typedef void (*FP)(char* s); void Invoke(char* s); int main(int argc,char* argv[]) { FP fp; //通常是用宏FP来声明一个函数指针fp fp=Invoke; fp("Hello World!\n"); return 0; } void Invoke(char* s) { printf(s); }
理解了函数指针,在实际开发中,遵循回调函数的使用机制就可以了。