系统程序员成长计划学习
关于李先静《系统程序员成长计划》这本书理论和源码的学习
zailushangha
这个作者很懒,什么都没留下…
展开
-
在加锁和解锁时候,初学者常犯的两个错误——摘抄自李先静博客
1、存在遗漏解锁的路径。初学者常见的做法就是,进入某个临界函数时加锁,在函数结尾的地方解锁,有时候,return的地方太多,在某一处忘记解锁是可能的,就像内存泄露一样,只是忘记解锁的后果更严重。就像下面的例子: DListRet dlist_insert(DList* thiz,size_t index,void* data) { DListNode* node = NULL; DListNode* curnode = NULL; return_val_if_fail(thiz !...原创 2020-07-08 13:47:40 · 623 阅读 · 0 评论 -
debug信息打印,不用assert,只打印一个警告的宏定义
我们需要定义两个宏,一个用于无返回值的函数: #define return_if_fail(p) if(!(p)) \ {printf("%s:%d Warning: "#p" failed.\n", \ __func__, __LINE__); return;} 一个用于有返回值的函数: #define return_val_if_fail(p, ret) if(!(p)) \ {printf("%s:%d Warning: "#p" failed.\n",\ __func__, __LINE_.转载 2020-07-06 17:22:41 · 165 阅读 · 0 评论 -
回调函数编写双向链表求和、找最大值学习笔记(摘抄自李先静博客)
1、自己之前在开发功能时候也常常封装很多函数。这种做法会造成重复的代码,让dlist的实现随着应用环境的变化而变化。 2、采样上一篇的回调函数法。这两个函数的实现和dlist_print的实现类似,无非是print那行代码要换成别的功能。在真正动手时,发现每个回调函数都要保存一些中间数据。大部分人选择了用全局变量来保存,这可以实现要求的功能(这也是我常常犯的毛病),但违背了禁用全局变量的原则。 (1).不要编写重复的代码。 写重复的代码很简单,甚至凭本能都可以写出来。但要想成为优秀的程序员,一定要克服原创 2020-07-01 21:02:58 · 266 阅读 · 0 评论 -
回调函数法编写通用的接口
以打印双向链表方法dlist_print函数为例 typedef struct _DListNode { struct _DListNode* prev; struct _DListNode* next; void* data; }DListNode; struct _DList { DListNode* first; }; typedefstruct _DListDList; 定义函数指针类型: typedef void (*DListDataPrin...原创 2020-06-29 21:36:52 · 194 阅读 · 0 评论