Чтобы знать, что на самом деле происходит, нам нужно определение struct list_head
:
struct list_head {
struct list_head *next, *prev;
};
Теперь рассмотрим макросы:
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
Если в коде, который я пишу, LIST_HEAD(foo)
, он будет расширен до:
struct list_head foo = { &(foo) , &(foo)}
, который представляет пустой двусвязный список с узлом заголовка , где указатели next
и prev
указывают на сам узел заголовка.
Это то же самое, что и:
struct list_head foo;
foo.next = &foo;
foo.prev = &foo;
Таким образом, эти макросы позволяют инициализировать двусвязный список.
И да, &
используется здесь как адрес оператора.
EDIT:
Вот это working example
По предоставленной вами ссылке. Вы имели:
struct list_head test = LIST_HEAD (check);
что неверно. Вы должны иметь:
LIST_HEAD (check);