你什么时候使用container_of宏?

Ben*_*min 2 c macros kernel device-driver linux-kernel

我知道宏的作用.

在许多内核级代码中,它通常用于遍历链表.

我想找到其他有用的案例.
你什么时候使用container_of或CONTAINING_RECORD宏?
什么时候宏非常有用?

Eri*_*nen 7

container_of 允许您通过省略指向父结构的指针来简化数据结构.

它在链表实现中使用,因此列表节点可以是任何结构的元素,任何人都可以找到父结构而无需携带显式指针.

另一个例子是struct work_struct.工作队列工作函数接收work_struct作为参数,并且它曾经具有通用的"数据"有效负载.删除了此数据值,使结构更小,因为工作函数可以调用container_of以查找其父结构.


Meh*_*dad 5

这是解决C没有泛型或模板的事实的一种方法。

您需要一个通用的链表,因此只需将指针放在节点本身内(这样您就可以抽象化结构本身的管理),然后用于CONTAINING_RECORD在您自己的代码中查找其余数据,例如:

struct Node { struct Node *prev, *next; }

//Now you can define functions that operate on a generic struct Node*

struct Item
{
    int myData;
    struct Node* node;  //this would point to the 'node' member of another Item
}
Run Code Online (Sandbox Code Playgroud)

现在,给定一个struct Node,您可以Item通过以下方式找到它:

CONTAINING_RECORD(ptr, Item, node)
Run Code Online (Sandbox Code Playgroud)