在看openflow源代碼的時候,發現各種宏定義,以及對鏈表的操作,簡單拿出來一個小例子,供學習使用。
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#define LIST_FOR_EACH_SAFE(ITER, NEXT, STRUCT, MEMBER, LIST) \
for (ITER = CONTAINER_OF((LIST)->next, STRUCT, MEMBER); \
(NEXT = CONTAINER_OF((ITER)->MEMBER.next, STRUCT, MEMBER), \
&(ITER)->MEMBER != (LIST)); \
ITER = NEXT)
//通過結構體成員變量的指針,得到結構體的指針
#define CONTAINER_OF(POINTER, STRUCT, MEMBER) \
((STRUCT *) ((char *) (POINTER) - offsetof (STRUCT, MEMBER)))
#define LIST_INITIALIZER(LIST) { LIST, LIST }
struct list
{
struct list *prev;
struct list *next;
};
struct Stu
{
char name[128];
struct list node;
};
/* List insertion. */
void list_insert(struct list *, struct list *);
int main()
{
struct list head = LIST_INITIALIZER(&head);
struct Stu *iter=NULL, *q=NULL;
phead = &head;
struct Stu A, B;
strcpy(A.name, "zhangsan");
strcpy(B.name, "lisi");
list_insert(&head, &A.node);
list_insert(&head, &B.node);
int i = 0;
//遍歷鏈表
LIST_FOR_EACH_SAFE(iter, q, struct Stu, node, &head) {
printf("%d:%s\n", ++i, iter->name);
}
return 0;
}
/* Inserts 'elem' just before 'before'. */
void
list_insert(struct list *before, struct list *elem)
{
elem->prev = before->prev;
elem->next = before;
before->prev->next = elem;
before->prev = elem;
}
輸出結果:
zhangsan
lisi