工程化编程实战callback接口学习笔记
编译运行
在menu.c中添加头文件string.h,
打开terminal,输入指令gcc -o test linktable.c menu.c进行编译,
然后./test运行,输入命令quit,结果如下:

quit命令无法运行。
分析原因
查看menu.c的代码,

输出This is a wrong cmd! 的原因是FindCmd函数返回的指针为空,进一步查看FindCmd函数,

继续查看SearchLinkTableNode函数,

该函数的第二个参数是一个函数指针,即回调函数。当:
1.pLinkTable为空;
2.Condition为空;
3.遍历pLinkTable找不到Condition(pNode)==SUCCESS的节点时,
函数返回NULL。1,2两种情况显然是正确的,
分析遍历pLinkTable的代码,循环条件为pNode != pLinkTable->pTail,
即循环遇到尾指针pTail就跳出循环了,并未检查尾指针的Condition是否为SUCCESS!
因此修改循环条件为pNode != NULL,重新编译运行:

quit指令能正常运行。
callback接口
一般一个函数调用另一个函数,被调用的函数是出现在方法体当中,而回调函数比较特殊,它是出现在参数列表当中。也就是说,当调用的时候,需要从其他地方拿到这个(回调)函数,以参数的形式传入。
实现机制:
1.定义一个回调函数;
2.提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
3. 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
使用回调函数可以使程序设计更加灵活,可以认为是有个功能我自己不写,交给别人来写,他写完之后,我运行我的程序时,把那个函数传给我就行,然后我来调用他写的函数,实现我的功能。这使得程序更有灵活性,因为这个功能就可以有多种实现方式,而不需要我关心具体实现细节,只要传入不同的函数即可。

浙公网安备 33010602011771号