欢迎来到天天文库
浏览记录
ID:37729932
大小:124.29 KB
页数:10页
时间:2019-05-29
《把Linux下的链表List移植到Win32》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、把Linux下的链表List移植到Win32作者:wilsone-mail:wilsonwong@126.comhttp://blog.chinaunix.net/u1/59572序言链表操作在Linux系统相当普遍,本文档把Linux下的链表操作移植到Win32平台下进行详细说明,并附上测试代码。链表操作定义文件………………………………………………………………………………………..测试代码…………………………………………………………………………………………………..《链表操作定义文件list.h》/*Linux下的链表操作移植到Win32*/#ifndef_
2、LINUX_LIST_H#define_LINUX_LIST_H#ifdef__cplusplusextern"C"{//如果当前运行环境为C++,则需要加上extern“C”#undefNULL#defineNULL0#else#undefNULL#defineNULL0#endif//平台定义#ifndefWIN32#defineWIN32#endif//计算结构里的某个成员的偏移量:把地址作为结构的开始地址,因此成员的地址即为偏移地址(相对地址)#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBE
3、R)//通过结构类型及其某一成员的指针,计算结构体变量地址:计算结构体成员的偏移地址,然后用该成员的地址减去偏移地址,便是结构体变量的地址#ifdefWIN32#definecontainer_of(ptr,type,member)(type*)((char*)ptr-offsetof(type,member))#else#definecontainer_of(ptr,type,member)({consttypeof(((type*)0)->member)*__mptr=(ptr);(type*)((char*)__mptr-offsetof(type,
4、member));})/*宏定义分解解析:(type*)0--------把0地址转换为结构体type,这种巧妙的0地址类型转换为计算结构体成员的偏移地址提供简单方法consttypeof(((type*)0)->member)*__mptr=(ptr)----获取成员member的数据类型并用此类型定义变量__mptr,同时把ptr指针传给__mptr(注意__mptr与ptr必须同类型);typeof是gnu扩展语法,在标准C++里不支持;当本人觉得这一步骤是多余的。因此本文件移植到Win32时,必须作适当调整。Offsetof(type,member)-
5、--计算结构体type的成员member的地址偏移量(以0地址转换结构体type变量,其成员的绝对地址就是偏移地址(绝对地址-0))(char*)__mptr-offsetof(type,member)----成员绝对地址(指针)减去成员的偏移地址(相对结构体指针)就是结构体地址了。(type*)((char*)__mptr-offsetof(type,member))----类型转换*/#endifstaticinlinevoidprefetch(constvoid*x){;}staticinlinevoidprefetchw(constvoid*x){;}
6、#defineLIST_POISON1((void*)0x00100100)#defineLIST_POISON2((void*)0x00200200)structlist_head{structlist_head*next,*prev;};#defineLIST_HEAD_INIT(name){&(name),&(name)}#defineLIST_HEAD(name)structlist_headname=LIST_HEAD_INIT(name)#defineINIT_LIST_HEAD(ptr)do{(ptr)->next=(ptr);(ptr)->
7、prev=(ptr);}while(0)staticinlinevoid__list_add(structlist_head*newi,structlist_head*prev,structlist_head*next);staticinlinevoidlist_add(structlist_head*newi,structlist_head*head);staticinlinevoidlist_add_tail(structlist_head*newi,structlist_head*head);staticinlinevoid__list_del(str
8、uctlist_head*prev,s
此文档下载收益归作者所有