1、Callback函数详解
把一段可执行的代码像参数传递一样传递给其他代码,而这段代码会在某个时刻被调用执行,这就叫回调。如果代码被立即执行就被称为同步回调,如果在之后晚点的某个时间再执行,则被称之为异步回调。
更通俗一点的解释是:函数F1调用函数F2时,F1通过参数给F2传递了另一个函数F3的指针,在F2执行的过程中会调用函数F3,这个动作就是回调(callback),而被作为指针传入、后面又被回调的函数F3就是回调函数。
2、menu中的回调函数
menu5.2整体结构如下:
- linktableInternal.h:LinkTableNode结构体定义了链表节点,LinkTable结构体定义了链表。
- linktable.h:定义和声明了LinkTable操作的接口,包括创建、删除链表,以及添加、删除、搜索链表节点等功能。
- linktable.c:实现了linktable.h中所定义的链表操作。
- menu.c:命令行菜单程序,使用linktable.h提供的链表接口实现所有功能。
其中 linktable.c 中的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;
}
其中参数 Condition (实参 SearchCondition)就是回调函数,允许用户自己设计传入的Condition参数来定制LinkTable的功能,最后根据是否存在该条指令进行相应的输出和函数调用。
3、回调函数的作用
- 通过回调函数给下层文件提供一个使用上层文件的接口,有效保护上层文件数据不被修改。
- 这里menu作为上层文件实现了Condition的定义,为代码提供了良好的可复用性和扩展性。