<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=list_for_each_entry</id>
	<title>list for each entry - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=list_for_each_entry"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=list_for_each_entry&amp;action=history"/>
	<updated>2026-09-01T03:59:01Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=list_for_each_entry&amp;diff=808&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 08:33 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=list_for_each_entry&amp;diff=808&amp;oldid=prev"/>
		<updated>2015-05-06T08:33:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#define list_entry(link, type, member) \&lt;br /&gt;
	((type *)((char *)(link)-(unsigned long)(&amp;amp;((type *)0)-&amp;gt;member)))&lt;br /&gt;
&lt;br /&gt;
#define list_head(list, type, member)		\&lt;br /&gt;
	list_entry((list)-&amp;gt;next, type, member)&lt;br /&gt;
&lt;br /&gt;
#define list_tail(list, type, member)		\&lt;br /&gt;
	list_entry((list)-&amp;gt;prev, type, member)&lt;br /&gt;
&lt;br /&gt;
#define list_next(elm, member)					\&lt;br /&gt;
	list_entry((elm)-&amp;gt;member.next, typeof(*elm), member)&lt;br /&gt;
&lt;br /&gt;
#define list_for_each_entry(pos, list, member)			\&lt;br /&gt;
	for (pos = list_head(list, typeof(*pos), member);	\&lt;br /&gt;
	     &amp;amp;pos-&amp;gt;member != (list);				\&lt;br /&gt;
	     pos = list_next(pos, member))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
member是pos所属类型的一个成员变量；&lt;br /&gt;
&lt;br /&gt;
list为一系列member所链接成的一个双向链表, 但同时list中所有的member均存在着对应的pos类型的实体(假设为pos_A, pos_B, pos_C, ...)。&lt;br /&gt;
&lt;br /&gt;
list_for_each_entry(pos, list, member)的功能就是遍历list，从中取出member变量，再利用 list_entry找到此 member变量所对应的pos类型的实体(pos_A, pos_B, pos_C, ...)赋值给pos，直到完成for循环。&lt;br /&gt;
&lt;br /&gt;
*应用场景&lt;br /&gt;
&lt;br /&gt;
在实际使用时，这个member可以用list_head:&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
struct list_head {&lt;br /&gt;
	struct list_head *next, *prev;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
然后不论是何种数据结构，只要往其中加入list_head成员，则可以方便地使用list_for_each_entry进行链表的遍历了，避免了在链表操作上花费更多的时间。&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*LIST_HEAD_INIT和INIT_LIST_HEAD有什么区别?&lt;br /&gt;
&lt;br /&gt;
首先，看定义：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#define LIST_HEAD_INIT(name) { &amp;amp;(name), &amp;amp;(name) }&lt;br /&gt;
&lt;br /&gt;
static inline void INIT_LIST_HEAD(struct list_head *list)&lt;br /&gt;
{&lt;br /&gt;
	list-&amp;gt;next = list;&lt;br /&gt;
	list-&amp;gt;prev = list;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
功能上应该是相同的，都是将name/list的next、prev指针指向它本身，即对链表进行初始化。&lt;br /&gt;
&lt;br /&gt;
那为什么要定义两个呢？&lt;br /&gt;
&lt;br /&gt;
其实这两个宏是用于不同的情况的：&lt;br /&gt;
&lt;br /&gt;
LIST_HEAD_INIT用于定义变量时初始化，如：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
struct list_head name = LIST_HEAD_INIT(name);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
而list_head变量已经存在，那如果还使用上述宏则会报错：&lt;br /&gt;
&lt;br /&gt;
 error: expected &amp;#039;;&amp;#039; before &amp;#039;}&amp;#039; token&lt;br /&gt;
&lt;br /&gt;
原因是C/C++中，类似于{}对结构体的赋值只有在定义变量时才能使用，这时就要使用 &lt;br /&gt;
INIT_LIST_HEAD：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
LIST_HEAD_INIT(&amp;amp;m_fileList);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
——尤其是在C++的class中，只能使用后者，因为class中是不能对非静态成员变量进行初始化的。&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>