Verwenden von Makros in C zum Definieren von Datenstrukturen

Ich versuche, mich mit dem Konzept der Verwendung von Makros zum Definieren von Datenstrukturoperationen zu beschäftigen. Der folgende Code ist ein einfaches Beispiel für die Verwendung der eingebauten Listenbibliothek in FreeBSD. In der Bibliothek sind alle Operationen als Makros definiert. Ich habe diesen Ansatz auch in einigen anderen Bibliotheken gesehen.

Ich kann sehen, dass dies einige Vorteile hat, z. Möglichkeit, eine beliebige Datenstruktur als Element in der Liste zu verwenden. Aber ich verstehe nicht ganz, wie das funktioniert. Zum Beispiel:

Was iststailhead? Dies scheint "nur" definiert zu sein.Wie geht man weiter?head undentries zu einer Funktion?Welcher Typ isthead, wie kann ich einen Zeiger darauf deklarieren?

Gibt es einen Standardnamen für diese Technik, mit dem ich nach Google suchen kann, oder ein Buch, das dieses Konzept erklärt? Alle Links oder eine gute Erklärung, wie diese Technik funktioniert, werden sehr geschätzt.

Dank anNiklas B. ich ranntegcc -E und habe diese Definition fürhead

<code>struct stailhead {
  struct stailq_entry *stqh_first;
  struct stailq_entry **stqh_last; 
} head = { ((void *)0), &(head).stqh_first };
</code>

und das fürstailq_entry

<code>struct stailq_entry {
 int value;
 struct { struct stailq_entry *stqe_next; } entries;
};
</code>

Also denke ichhead ist vom Typstruct stailhead.

<code>#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>

struct stailq_entry {
        int value;
        STAILQ_ENTRY(stailq_entry) entries;
};

int main(void)
{
        STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
        struct stailq_entry *n1;
        unsigned i;
        STAILQ_INIT(&head);                     /* Initialize the queue. */

        for (i=0;i<10;i++){
                n1 = malloc(sizeof(struct stailq_entry));   /* Insert at the head. */
                n1->value = i;
                STAILQ_INSERT_HEAD(&head, n1, entries);
        }
        n1 = NULL;

        while (!STAILQ_EMPTY(&head)) {
                n1 = STAILQ_LAST(&head, stailq_entry, entries);
                STAILQ_REMOVE(&head, n1, stailq_entry, entries);
                printf ("n2: %d\n", n1->value);
                free(n1);
        }

        return (0);
}
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage