linux内核之宏定义list_entry

Posted 小小灰迪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核之宏定义list_entry相关的知识,希望对你有一定的参考价值。

/**
linux v2.4.18
* list_entry - get the struct for this entry
* @ptr:	the &struct list_head pointer.
* @type:	the type of the struct this is embedded in.
* @member:	the name of the list_struct within the struct.
*/
#define list_entry(ptr, type, member) \\
	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))


ptr是指向list_head类型链表的指针,type为一个结构,而member为结构type中的一个域,类型为list_head,这个宏返回指向type结构的指针

// 设有如下结构体定义:
typedef struct xxx

     ……(结构体中其他域,令其总大小为size1)
     type1 member;
     ……(结构体中其他域)
type;

/*
定义变量:
   type a;
   type * b;
   type1 * ptr;
执行:
   ptr=&(a.member);
   b=list_entry(ptr,type,member);
则可使b指向a,得到了a的地址。
*/
/**
linux v5.19.17
 * list_entry - get the struct for this entry
 * @ptr:	the &struct list_head pointer.
 * @type:	the type of the struct this is embedded in.
 * @member:	the name of the list_head within the struct.
 */
#define list_entry(ptr, type, member) \\
	container_of(ptr, type, member)

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:	the pointer to the member.
 * @type:	the type of the container struct this is embedded in.
 * @member:	the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) (				\\
	void *__mptr = (void *)(ptr);					\\
	static_assert(__same_type(*(ptr), ((type *)0)->member) ||	\\
		      __same_type(*(ptr), void),			\\
		      "pointer type mismatch in container_of()");	\\
	((type *)(__mptr - offsetof(type, member))); )


最全Pycharm教程(24)——Pycharm编辑器功能之宏定义

  1、为什么使用宏

  增加你须要反复某种操作非常多次。比如选中源代码并将其发送到控制台端调试,我们能不能将着一系列操作简化为一步,甚至用一组快捷键来取代呢?

  2、准备工作

  (1)Pycharm版本号为2.7或者更高。

  (2)与 product documentation中的行为保持一致。

  (3)创建了一个项目,并向当中加入了至少两个脚本,详见Getting Started和 Debugger

  3、录制宏

  在主菜单上选择Edit→Macros→Start Macro Recording命令。在窗体底部出现Macro recording started的提示信息。

  打开你想要运行的脚本文件(注意Using Macros in the Editor中所描写叙述得列表限制),然后进行相应的需求操作:

  (1)全选编辑器中的代码(比如在编辑窗体中按下Ctrl+A)

  (2)右击,在弹出的快捷菜单中选择Execute selection in console命令

  然后单击主菜单的Edit→Macros→Stop Macro Recording命令,Pycharm会提示你保存当前记录的宏。此时假设未指定宏明,Pycharm会将其设定为一个暂时的宏命令,这里我们将这个宏命名为 "Run in console":

  此时,再次查看Edit→Macros菜单。我们会在列表中发现我们刚刚定义的宏命令:

  4、为宏命令指定快捷键

  接下来我们为这条宏命令指定一个快捷键组合。做法例如以下。

  在设置对话框中,打开Keymap页,展开Macros节点。找到我们新加入的宏命令"Run in console",右击,在弹出的快捷菜单中选择Add keyboard shortcut:

  接下来。在Enter keyboard shoctrut dialog对话框中指定期望的快捷键组合。注意此时我们仅仅能通过鼠标指针来单击对话框中的控件,不论什么键盘操作都会被觉得是快捷键的设置内容。

  如你所见。系统并未提示相关快捷键冲突,我们的设置可用,单击应用并关闭对话框。此时新增的快捷键会显示在菜单中:

  5、宏命令的使用

  如今我们完毕了一个宏命令的私人订制。此时我们能够在控制台端执行不论什么已打开的脚本文件。我们能够通过菜单命令Edit→Macros→Run in console来实现。也能够通过快捷键Alt+R来更为快捷的完毕这个功能。我们尝试一下:

  在编辑器中打开另外一个脚本文件,按下Alt+R,OK。脚本被自己主动载入到了控制台中并执行:

以上是关于linux内核之宏定义list_entry的主要内容,如果未能解决你的问题,请参考以下文章

调试技巧之宏定义开关

leveldb单元测试之宏定义源码剖析

驱动链表(LIST_ENTRY)

最全Pycharm教程(24)——Pycharm编辑器功能之宏定义

Flask之模板之宏继承包含

LIST_ENTRY 已损坏(即双重删除)。不知道为啥