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的主要内容,如果未能解决你的问题,请参考以下文章