簡體   English   中英

在C宏中,&符號的應用是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM