C语言回调函数使用

回调函数的实现主要基于函数指针 void (*fun)(); 

详细代码如下:

#include <stdio.h>

typedef struct{
    int status;
    void (*statusChange)(); //定义回调函数指针
}T_Device;

// 一个全局变量
T_Device g_device;

// 注册回调函数
// 实质为将要回调的函数callback地址传给回调函数指针
void addCallbackFunc(void (*statusChange)(int status)){
    g_device.statusChange = statusChange;
}

void run(){
    g_device.status = 1; // 该处状态值可由其他函数修改达到不同效果,这里为方便展示直接赋值
    // 回调函数被触发
    if(g_device.status == 1){
        // 若存在回调函数则执行
        if(g_device.statusChange != NULL){
            g_device.statusChange(g_device.status);
        }
    }
}


// 定义一个回调函数体
void callback(int status){
    printf("call back -> status %d\n", status);

}

int main()
{
    addCallbackFunc(callback);
    run();    
}

<think>好的,我现在需要回答用户关于C语言回调函数使用示例的问题。首先,用户希望看到具体的代码示例,所以我得先确保提供的代码正确且易于理解。根据引用中的内容,用户已经有一个简单的示例,但可能需要更详细的解释或更多的例子。 首先,回顾用户提供的引用内容。引用[1]给出了一个基本的回调函数示例,包括函数原型、调用函数和实际回调函数。引用[4]提到回调函数的作用是解耦,这点需要强调。用户可能想知道为什么使用回调函数而不是普通函数调用,所以解释解耦的重要性是关键。 接下来,我应该构建一个清晰的回答结构。首先,解释回调函数的概念和作用,引用[3]提到回调函数作为参数传递,在特定事件被调用,这可以用来开头。然后,分步骤解析示例代码,说明每个部分的作用,如定义回调类型、执行操作的函数、回调的实现以及主函数中的调用。这样用户能逐步理解代码流程。 此外,用户可能希望看到不同的应用场景,比如事件处理或排序算法。引用[2]提到在C++中应优先使用其他方法,但在C语言回调函数很常见。可以举一个排序时使用回调函数比较不同数据类型的例子,展示其灵活性。这样能体现解耦的优势,如引用[4]所述。 需要注意代码的格式,确保使用正确的语法,比如函数指针的typedef,以及调用时的参数传递。同时,检查代码是否有错误,比如函数签名是否匹配,避免指针错误。例如,在比较函数中,确保参数类型正确,并返回适当的整数值。 可能用户还会对回调函数的实际应用有疑问,比如在库函数或异步操作中的使用。可以提到如GUI事件处理或网络编程中的回调,但保持示例简单,避免复杂化。重点在于通过代码示例展示机制,而不是深入复杂场景。 最后,生成相关问题,帮助用户进一步学习。问题可能涉及回调函数的优缺点、与普通函数的区别、在项目中的实际应用等,这些都能引导用户深化理解。确保问题与回答内容相关,并覆盖用户可能感兴趣的方面。 总结步骤:解释概念、分步代码解析、应用场景示例、总结优点,最后生成相关问题。需要确保语言简洁,代码正确,引用适当,并符合用户的中文要求。</think>以下是一个详细且规范的C语言回调函数使用示例及解析: ### C语言回调函数使用示例 回调函数是通过函数指针实现的编程技术,主要用于实现模块解耦和事件驱动编程[^3][^4] #### 示例代码分步解析 ```c #include <stdio.h> // 步骤1:定义回调函数类型 typedef void (*DataProcessor)(int); // 步骤2:创建接收回调的函数 void process_data(int arr[], int size, DataProcessor processor) { for(int i=0; i<size; i++) { // 处理过程中触发回调 processor(arr[i]); // 对每个元素执行回调[^1] } } // 步骤3:实现具体回调函数 void print_square(int num) { printf("%d²=%d\n", num, num*num); } void print_cube(int num) { printf("%d³=%d\n", num, num*num*num); } // 步骤4:主函数调用 int main() { int dataset[] = {2,3,5,7}; const int size = sizeof(dataset)/sizeof(int); printf("平方计算:\n"); process_data(dataset, size, print_square); printf("\n立方计算:\n"); process_data(dataset, size, print_cube); return 0; } ``` #### 代码执行结果 ``` 平方计算: 2²=4 3²=9 5²=25 7²=49 立方计算: 2³=8 3³=27 5³=125 7³=343 ``` ### 技术要点解析 1. **类型定义**:`typedef void (*DataProcessor)(int)` 明确定义回调函数签名[^1] 2. **解耦实现**:`process_data`函数不关心具体处理逻辑,通过回调参数实现功能扩展[^4] 3. **动态绑定**:主程序运行时决定使用平方还是立方计算,无需修改处理函数 4. **通用架构**:这种模式常见于事件处理、算法策略等场景[^3] ### 典型应用场景 1. 事件驱动编程(如GUI按钮点击事件) 2. 排序算法中的比较函数(qsort函数实现) 3. 异步IO操作完成通知 4. 插件系统开发
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值