把Linux下的链表List移植到Win32

把Linux下的链表List移植到Win32

ID:37729932

大小:124.29 KB

页数:10页

时间:2019-05-29

把Linux下的链表List移植到Win32_第1页
把Linux下的链表List移植到Win32_第2页
把Linux下的链表List移植到Win32_第3页
把Linux下的链表List移植到Win32_第4页
把Linux下的链表List移植到Win32_第5页
资源描述:

《把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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。