关于c语言回调函数的一些说明

回调函数 callback 的实现原理是什么? - 知乎 (zhihu.com)
最近的项目中涉及到很多c的代码,里面有一些信号槽机制,signal、listener、emit等。但是其实底层都是回调函数callback。

举个例子

// 定义函数指针
int (* g_pFun) (int x, int y);


// 定义两个函数
int Max(int x ,int y){
    
}


int Min(int x, int y){
    
}


int main(int argc, char* argv[]){
    int r;
    int a = 10;
    int b = 15;
    g_pFun = Max;
    r = g_pFun(a, b);  // 相当于执行Max
    g_pFun = Min;
    r = g_pFun(a, b);  // 相当于执行Min
    return 0;
}

大家可以看到,同样是执行g_pFun,却执行的不同的函数。这就是函数指针的妙用。

这里Max,Min函数就是钩子函数,把函数指针g_pFun指向函数Max,Min的过程,就是"挂钩子"的过程,相当于把钩子函数“挂到”函数指针上。非常形象。

在我们的代码中,常常把挂钩子的过程叫做注册,会提供一个注册函数,让使用者把自己编写的钩子函数挂在已经声明的函数指针上,这个注册函数的参数就是我们的函数指针了,比如,我们可以给刚才的函数指针提供一个注册函数

// 注册
int RegFun(int (*pFun)(int x, int y)){
    g_pFun = pFun;
    return 0;
}

总结:定义一个函数指针->注册(挂钩子)->调用。
注册这里可以换不同的函数。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回调函数是一种特殊的函数,它作为参数传递给另一个函数,并由那个外部函数在其执行流程中调用。这种设计模式使得程序可以动态地控制某些操作、事件处理或是与其他组件交互的方式。 在C语言中,回调函数的应用非常广泛,尤其在需要处理异步事件、定时任务或者是依赖于用户输入的情况下。例如,在游戏开发、网络编程、GUI库等场景中常能看到回调函数的身影。 ### 判断参数是否为空 在C语言中,通常通过检查指针是否为NULL来判断某个参数是否为空。下面是一个简单的例子说明如何使用回调函数和判空机制: ```c #include <stdio.h> // 定义一个简单的回调函数原型,接受两个整数并返回结果 typedef int (*CallbackFunction)(int x, int y); void processWithCallback(CallbackFunction callback) { // 检查传入的回调函数是否为空 if (callback == NULL) { printf("Error: Callback function is not provided or NULL.\n"); return; } // 调用回调函数 int result = callback(5, 7); // 假设此值非NULL表示有效 printf("Result from callback: %d\n", result); } int add(int a, int b) { // 实现一个加法回调函数 return a + b; } int main() { CallbackFunction func = add; // 将add函数转换成回调形式 // 正确使用回调函数 processWithCallback(func); // 错误情况:尝试使用无效的回调函数 processWithCallback(NULL); return 0; } ``` ### 相关问题: 1. **回调函数的主要应用场景是什么?** 主要应用于事件驱动编程、网络请求处理、图形用户界面的事件响应、游戏引擎的更新循环等需要异步处理的场景。 2. **如何安全地在C语言中使用回调函数?** 使用前应始终检查回调函数是否为NULL,避免在调用前忘记提供回调函数导致程序错误。合理地管理资源和状态转移,确保回调函数的生命周期与程序的其他部分同步。 3. **C语言中常见的几种类型的回调函数有哪些?** 包括但不限于事件处理回调(如按钮点击)、数据计算回调(如数学运算)、状态改变回调(如系统状态变化)以及复杂应用中的服务端与客户端之间的消息交换回调等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值