[英]What is the application of ampersand within C macros?
我正在讀linux/list.h
頭文件,它有這個宏 :
#define LIST_HEAD_INIT(name) { &(name), &(name) }
我想知道什么時候寫LIST_HEAD_INIT(birthday_list)
宏如何擴展?
LIST_HEAD_INIT用於初始化列表頭結構實例。
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
來自linux / types.h:
struct list_head {
struct list_head *next, *prev;
};
這擴展到了
struct list_head name = { &(name), &(name) }
如您所見,它被擴展,現在結構實例“name”的“prev”和“next”指針字段指向自身。 這是列表頭的初始化方式。
初始化后LIST_HEAD(birthday_list)是birthday_list.prev = birthday_list.next =&birthday_list“birthday_list”是雙鏈接列表的頭節點,它是空的,而不是將prev和next指針留給NULL,它們被設置為指向返回頭節點。
struct list_head birthday_list = {
.next = &birthday_list,
.prev = &birthday_list
}
&符號並沒有什么特別之處,它們只是另一種象征。 LIST_HEAD_INIT(birthday_list)
擴展為{ &(birthday_list), &(birthday_list) }
如果要自己檢查此擴展或其他宏擴展,可以直接查看預處理器的輸出。 GCC有-E參數來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.