对于一般的函数来说,函数的编写和调用都是我们自己。但callback函数不是这样的,它是由我们编写但是不由我们调用,由我们将函数指针传给其他模块,再由其他模块通过我们传递的函数指针来调用我们编写的函数。
在menu5.2中,向其他模块传递callback函数的 函数如下,传递的callback函数就是Condition参数,args声明为void* 是为了更好的通用性。
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args) { if(pLinkTable == NULL || Conditon == NULL) { return NULL; } tLinkTableNode * pNode = pLinkTable->pHead; while(pNode != NULL) { if(Conditon(pNode,args) == SUCCESS) { return pNode; } pNode = pNode->pNext; } return NULL; }
这里由 main函数的FindCmd调用 SearchLinkTableNode函数,传递callback函数SearchCondition
int main() { InitMenuData(&head); /* cmd line begins */ while(1) { char cmd[CMD_MAX_LEN]; printf("Input a cmd number > "); scanf("%s", cmd); tDataNode *p = FindCmd(head, cmd); //callback位置 //省略下面 } tDataNode* FindCmd(tLinkTable * head, char * cmd) { return (tDataNode*)SearchLinkTableNode(head,SearchCondition,(void*)cmd); }
Menu中还有一个设计,就是DataNode结构体,定义如下
typedef struct DataNode { tLinkTableNode * pNext; char* cmd; char* desc; int (*handler)(); } tDataNode;
tLinkTableNode的结构体如下所示
typedef struct LinkTableNode { struct LinkTableNode * pNext; }tLinkTableNode;
可以看到,将tLinkTableNode*强转成 tDataNode*,由于两个结构体的第一个成员变量是相同的,占相同大小的空间,因此实现了良好的复用。
整个menu.c运行的效果如下
标签:函数,callback,Menu,cmd,pNode,tDataNode,tLinkTableNode From: https://www.cnblogs.com/ttttttx/p/17282206.html