工程化编程实战callback接口学习笔记
工作环境:win10、MinGW-W64(gcc version 5.2.0、gdb version 7.9.1)
1. VS Code 下编译运行
在项目目录下运行命令:**gcc .\linktable.c .\menu.c -o cmdline
**
经判断缺少头文件 string.h ,在 menu.c 的首部添加 #include
后重新编译
百度后发现原因是缺少头文件 pthread.h ,在 linktable.c 中添加 #include
并修改编译命令为:gcc .\linktable.c .\menu.c -o cmdline -lpthread
成功编译后,运行可执行文件 cmdline.exe ,测试发现运行输入cmd 时有bug!
2. 通过VSCode+GDB调试程序分析原因
重新编译生成可调试的可执行程序:gcc -g .\linktable.c .\menu.c -o cmdline -lpthread
运行命令: gdb .\cmdline.exe
,使用 gdb 对程序今行调试。
通过对 menu.c 源码初步分析,选择 FindCmd() 函数为下断点,即 break 60
输入 quit 后,单步,接着单步步入(step)SearchLinkTableNode() 函数,如下图:
发现,当执行到应该判断输入命令是否为 “quit” 时, 没能进入循环体判断语句,而直接返回 NULL,故会导致之后窗口输出 “This is a wrong cmd!” 。
结合源码分析,问题出在 while 循环条件,最后对 quit 的判断没能进行,所以这里修改 while 循环条件为 while(pNode != pLinkTable->pTail->pNext)
。
重新编译运行,发现 bug 已解决:
3. 分析callback接口设计
什么是回调函数?
回调函数就是一个通过函数指针调用的函数。把函数的指针(地址)作为参数传递给另一个函数,当这个指针调用其所指向的函数时,就称这是回调函数。回调函数不是该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
工作机制
- 定义一个回调函数
- 将回调函数的地址注册给调用者
- 当特定事件发生时,调用者使用函数指针调用函数来响应相关事件