查看“︁list for each entry”︁的源代码
←
list for each entry
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于这些用户组的用户执行:*、
用户
您可以查看和复制此页面的源代码。
<pre class="prettyprint"> #define list_entry(link, type, member) \ ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member))) #define list_head(list, type, member) \ list_entry((list)->next, type, member) #define list_tail(list, type, member) \ list_entry((list)->prev, type, member) #define list_next(elm, member) \ list_entry((elm)->member.next, typeof(*elm), member) #define list_for_each_entry(pos, list, member) \ for (pos = list_head(list, typeof(*pos), member); \ &pos->member != (list); \ pos = list_next(pos, member)) </pre> member是pos所属类型的一个成员变量; list为一系列member所链接成的一个双向链表, 但同时list中所有的member均存在着对应的pos类型的实体(假设为pos_A, pos_B, pos_C, ...)。 list_for_each_entry(pos, list, member)的功能就是遍历list,从中取出member变量,再利用 list_entry找到此 member变量所对应的pos类型的实体(pos_A, pos_B, pos_C, ...)赋值给pos,直到完成for循环。 *应用场景 在实际使用时,这个member可以用list_head: <pre class="prettyprint"> struct list_head { struct list_head *next, *prev; }; </pre> 然后不论是何种数据结构,只要往其中加入list_head成员,则可以方便地使用list_for_each_entry进行链表的遍历了,避免了在链表操作上花费更多的时间。 ---- *LIST_HEAD_INIT和INIT_LIST_HEAD有什么区别? 首先,看定义: <pre class="prettyprint"> #define LIST_HEAD_INIT(name) { &(name), &(name) } static inline void INIT_LIST_HEAD(struct list_head *list) { list->next = list; list->prev = list; } </pre> 功能上应该是相同的,都是将name/list的next、prev指针指向它本身,即对链表进行初始化。 那为什么要定义两个呢? 其实这两个宏是用于不同的情况的: LIST_HEAD_INIT用于定义变量时初始化,如: <pre class="prettyprint"> struct list_head name = LIST_HEAD_INIT(name); </pre> 而list_head变量已经存在,那如果还使用上述宏则会报错: error: expected ';' before '}' token 原因是C/C++中,类似于{}对结构体的赋值只有在定义变量时才能使用,这时就要使用 INIT_LIST_HEAD: <pre class="prettyprint"> LIST_HEAD_INIT(&m_fileList); </pre> ——尤其是在C++的class中,只能使用后者,因为class中是不能对非静态成员变量进行初始化的。
返回
list for each entry
。
导航菜单
个人工具
创建账号
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
设置
查看历史
更多
搜索
导航
首页
Ubuntu
Android
C&CPP
Java
Python
AI
大杂烩
最近更改
工具
所有页面
文件列表
页面信息
特殊页面