571
社区成员
发帖
与我相关
我的任务
分享回调函数是一个函数,这个函数将会在另一个函数完成执行后立即执行。回调函数是一个作为参数传给另一个函数的函数,这个回调函数会在传给的函数内部执行。这一方法可以使得函数像使用普通参数一样使用其他函数。提高了函数使用的灵活性。
在计算机科学中,回调函数是指一段以参数的形式传递给其它代码的可执行代码。回调函数是一种软件设计上的概念,和编程语言没有关系,几乎所有的编程语言都能实现回调函数。回调函数又是异步下不可或缺的一种机制。
回调函数就是写一个函数,让预先写好的系统来调用。你调用系统的函数,是直调。让系统调用你的函数,就是回调。一般写程序是你调用系统的API,如果反过来,由程序员写一个函数,让系统调用程序员写的函数,那就是回调,那个直接被系统调用的函数就是回调函数(间接被调用的不算)。
例如,我们在一个网页有关的函数中调用外部API,我们肯定需要异步执行,然后传入回调函数,如果是同步执行,是阻塞的,我们需要等待调用API结果之后才能执行后面的函数,这样可能会造成界面加载卡顿、延时的情况发生,而使用回调函数异步执行,则不影响我们后面函数的执行,所以是非阻塞的。
在menu程序中,linktableInternal.h定义了LinkTable的内部数据结构。包括LinkTableNode结构体和LinkTable结构体,这两个结构体分别表示链表的节点和链表本身。这个文件主要被linktable.h和linktable.c引用,提供了链表操作所需的基本数据结构;
linktable.h这个头文件定义和声明了LinkTable操作的接口。包括创建、删除链表,以及添加、删除、搜索链表节点等功能。同时,这个文件还包含了一些宏定义,例如SUCCESS和FAILURE,用于表示操作结果;
linktable.c实现了linktable.h中定义的链表操作接口。包括创建链表、删除链表、添加节点、删除节点、搜索节点等功能。这个文件中的函数实现了回调函数机制。例如,SearchLinkTableNode函数通过传入一个回调函数Condition来对链表进行搜索,实现了搜索功能的解耦;
menu.c包含了一个简单的命令行菜单程序,它使用了linktable.h提供的链表接口。在这个程序中,命令及其对应的描述和处理函数被存储在一个链表中。程序通过查找链表来处理用户输入的命令。这个程序中的FindCmd函数使用了之前提到的SearchLinkTableNode函数,展示了如何利用回调函数进行搜索。
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Condition(tLinkTableNode * pNode, void * args),void * args)
{
if(pLinkTable == NULL || Condition == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Condition(pNode, args) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
int Condition(tLinkTableNode * pLinkTableNode, void * args)
{
char * cmd = (char*) args;
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if(strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
/*函数SearchLinkTableNode( *pLinkTable, Conditon, args),即使用了Condition函数作为SearchLinkTableNode函数的参数,其中传入的Condition函数允许用户自己设计,通过在SearchLinkTableNode函数中调用传入的Condition函数,并传入参数,实现了用户自定义查询条件。
find a cmd in the linklist and return the datanode pointer */
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
return (tDataNode*)SearchLinkTableNode(head, Condition, (void*)cmd);
}
/*在FindCmd函数中,将Condition函数作为参数传入SearchLinkTableNode,并传入cmd参数,最后在SearchLinkTableNode函数中将参数head->phead和cmd传入Condition函数,并调用。*/
尾号:110