簡體   English   中英

c編程#define struct {}聲明

[英]c programming #define struct { } declaring

我在看Glibc代碼。 一些glibc隊列的代碼引起了我的注意。 我無法給出這個結構定義的含義。 此結構沒有名稱。 為什么? 它是如何工作的?

#define LIST_ENTRY(type)                        \
struct {                                \
    struct type *le_next;   /* next element */          \
    struct type **le_prev;  /* address of previous next element */  \
}

資源

這實際上是一個預處理器宏,可以在其他地方擴展(最有可能是尾隨名稱)。

在該頭文件開頭的注釋中,有一個對queue(3)手冊頁的引用,其中包含有關該頭文件和其他宏的更多詳細信息:

宏LIST_ENTRY聲明了一個連接列表中元素的結構。

以及使用示例:

 LIST_HEAD(listhead, entry) head = LIST_HEAD_INITIALIZER(head); struct listhead *headp; /* List head. */ struct entry { ... LIST_ENTRY(entry) entries; /* List. */ ... } *n1, *n2, *n3, *np, *np_temp; LIST_INIT(&head); /* Initialize the list. */ n1 = malloc(sizeof(struct entry)); /* Insert at the head. */ LIST_INSERT_HEAD(&head, n1, entries); 

作為這個C代碼(不是C ++),而C缺少模板,這個預處理器宏可以用來“模擬”模板(注意type參數)。

它是一個用於聲明結構類型的宏,帶有指向第二個結構類型實例的nextprev指針。 第二種類型可以是父類型,因此您可以創建一個“可鏈接的結構”,如下所示:

struct foo {
  LIST_ENTRY(foo) list;
  int value;
};

這將創建一個包含名為list的成員的struct foo ,而該成員又是問題中的結構,指針指向struct foo

我們現在可以像這樣創建一個struct foo的小鏈表:

struct foo fa, fb;
fa.value = 47;
fa.list.le_next = &fb;
fa.list.le_prev = NULL;
fb.value = 11;
fb.list.le_next = NULL;
fb.list.le_prev = &fa.list.le_next;

我對最后一行並不是100%肯定,但我認為這有點道理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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