C语言中的回调函数



回调函数用途广泛,尤其是在事件驱动的编程中。当触发特定事件时,映射到该事件的回调函数将被执行以响应这些事件。这通常用于 GUI 应用程序中,例如按钮点击可以启动一系列预定义的动作。

回调函数

回调函数基本上是任何作为参数传递给其他代码的可执行代码,该代码预计会在给定时间回叫或执行该参数。我们可以用其他方式定义它,例如:如果函数的引用作为参数传递给另一个函数以进行调用,则称为回调函数。

回调机制依赖于**函数指针**。函数指针是一个存储函数内存地址的变量

这是一个简单的 C 语言中的 hello() 函数:

void hello(){
   printf("Hello World.");
}

我们如下声明指向此函数的指针:

void (*ptr)() = &hello;

现在我们可以使用此函数指针调用该函数,**(*ptr)();**

C语言中回调函数的示例

在这个例子中,hello() 函数被定义为 myfunction() 的参数。

#include <stdio.h>

void hello(){
   printf("Hello World\n");
}

void callback(void (*ptr)()){

   printf("Calling a function with its pointer\n");
   
   (*ptr)();   // calling the callback function
}

main(){

   void (*ptr)() = hello;

   callback(ptr);
}

输出

Calling a function with its pointer
Hello World

带参数的回调函数

在下面给出的示例中,我们还声明了两个具有相同原型的函数:square() 和 root()。

int square(int val){
   return val*val;
}

int root(int val){
   return pow(val, 0.5);
}

回调函数被定义为接收一个参数以及一个具有整数参数的函数指针,该参数与上述函数匹配。

int callback(int a,  int (*ptr)(int)){

   int ret = (*ptr)(a);

   return ret;

}

在 main() 函数中,我们通过传递一个整数和函数名(**square** / **root**)来调用回调,该函数名成为回调定义中的函数指针。

带参数的回调函数示例

完整的代码如下:

#include <stdio.h>
#include <math.h>

int callback(int a, int (*print_callback)(int));
int square(int value);
int root (int value);

int main(){
   
   int x = 4;
   
   printf("Square of x: %d is %d\n", x, callback(x, square));
   printf("Square root of x: %d is %d\n", x, callback(x, root));
   
   return 0;
}

int callback(int a,  int (*ptr)(int)){
   int ret = (*ptr)(a);
   return ret;
}

int square(int val){
   return val*val;
}

int root(int val){
   return pow(val, 0.5);
}

输出

Square of x: 4 is 16
Square root of x: 4 is 2

C语言中回调函数的类型

有两种**回调函数类型**:

同步回调

当回调函数传递给另一个函数时,该函数将其作为其过程的一部分执行,则该回调函数是同步的。调用函数在继续执行之前等待回调函数完成。当您需要立即获得结果或希望确保在继续执行之前完成一项任务时,这很有用。

异步回调

在这种情况下,调用函数触发回调函数,但不等待它完成。相反,它继续执行。它导致非阻塞操作。它通常用于事件驱动的编程中。

通用回调函数帮助开发人员编写用途广泛且更具适应性的 C 程序。

在本章中,我们解释了如何使用函数指针来增强 C 程序的灵活性。此外,我们展示了如何创建不限于特定函数指针类型的通用回调函数。

广告