文件名称:声明和初始化-复高斯分布的数学基础理论
文件大小:6.48MB
文件格式:PDF
更新时间:2024-06-28 07:07:18
嵌入式 Linux C
(1)声明和初始化 实际上 Linux 只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建 立起来的呢?这里是使用 LIST_HEAD()这个宏来构建的。 #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name) 这样,当需要用 LIST_HEAD(nf_sockopts)声明一个名为 nf_sockopts 的链表头时,它的 next、prev 指针都初始化为指向自己。这样就构建了一个空链表,因为 Linux 用头指针的 next 是否指向自己来判断链表是否为空。 static inline int list_empty(const struct list_head *head) { return head->next == head; } 除了用 LIST_HEAD()宏在声明的时候初始化一个链表以外,Linux 还提供了一个 INIT_LIST_HEAD 宏用于运行时初始化链表: #define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0) (2)插入 对链表的插入操作有两种:在表头插入和在表尾插入。Linux 为此提供了两个接口: static inline void list_add (struct list_head *new, struct list_head *head); static inline void list_add_tail (struct list_head *new, struct list_head *head); 因为 Linux 链表是循环表,且表头的 next、prev 分别指向链表中的第一个和最末一个节点, 所以,list_add 和 list_add_tail 的区别并不大,实际上,Linux 分别用以下两个函数来实现接口。 static inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next) { next->prev = new;