Linux C 函数指针应用---回调函数

本文介绍了Linux C中函数指针的应用,重点讲解了回调函数的概念和作用。回调函数是一个通过函数指针调用的函数,常用于系统编程中的异步处理。文章通过实例解释了回调函数的使用场景、如何起作用以及其带来的异步执行的好处。
摘要由CSDN通过智能技术生成

    (这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知)

    我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表了函数的入口地址。当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,可以将函数作为参数传递给函数指针。

    那函数指针在我们实际编程中会起到怎样的作用呢?前一篇关于函数指针的文章中,我们已经提到线程创建、信号注册中都用到了函数指针,下面我们将介绍函数指针的一个经典应用---回调函数。

    看一看百度百科如何定义的回调函数:

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

     简单的讲,一般写程序是你调用系统的API,如果把关系反过来,你写一个函数,让系统调用你的函数,那就是回调了,那个被系统调用的函数就是回调函数

     说详细点,我们知道,编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application programming interface,应用编程接口),以供应用程序员使用。所以在抽象层的图示里,库位于应用的底下。

     当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。

     我们可以这样理解:有一家旅馆提供叫醒服务,但

Linux 应用程序中,回调函数是一种常见的编程技术。它可以让你在程序运行时动态地将一个函数指针传递给另一个函数,以便在特定的事件发生时调用该函数。 例如,当用户点击一个按钮时,可以使用回调函数来处理该事件。回调函数通常被定义为一个函数指针,它指向一个函数,该函数将在事件发生时被调用。 下面是一个简单的示例程序,演示了如何使用回调函数来处理用户输入事件: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gtk/gtk.h> void on_button_clicked(GtkWidget *widget, gpointer data) { g_print("Hello, world!\n"); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label("Click me!"); gtk_container_add(GTK_CONTAINER(window), button); g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 在上面的示例程序中,我们使用了 GTK+ 库创建了一个简单的窗口和一个按钮。然后,我们使用 `g_signal_connect` 函数将按钮的 `"clicked"` 事件连接到一个回调函数 `on_button_clicked`。当用户点击按钮时,GTK+ 库将自动调用该函数回调函数的第一个参数通常是一个指向触发事件的控件的指针,而第二个参数通常是一个指向用户定义的数据的指针。在本例中,我们没有传递任何用户定义的数据,因此第二个参数为 `NULL`。 需要注意的是,不同的 GUI 库可能有不同的回调函数接口。上面的示例程序使用了 GTK+ 库,因此回调函数的参数类型和格式可能与其他 GUI 库不同。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值