Używanie makr w C do definiowania struktur danych

Próbuję objąć głowę koncepcją używania makr do definiowania operacji struktury danych. Poniższy kod jest prostym przykładem użycia wbudowanej biblioteki list w FreeBSD. W bibliotece wszystkie operacje są zdefiniowane jako makra. Widziałem to podejście także w kilku innych bibliotekach.

Widzę, że ma to pewne zalety. możliwość wykorzystania dowolnej struktury danych jako elementu na liście. Ale nie do końca rozumiem, jak to działa. Na przykład:

Co jeststailhead? To wydaje się być „po prostu” zdefiniowane.Jak przejśćhead ientries do funkcji?Jaki jest typhead, jak mogę zadeklarować wskaźnik do tego?

Czy istnieje standardowa nazwa tej techniki, której mogę użyć do wyszukiwania google lub jakiejkolwiek książki wyjaśniającej tę koncepcję? Wszelkie linki lub dobre wyjaśnienie, jak ta technika działa, zostaną docenione.

DziękiNiklas B. Pobiegłemgcc -E i otrzymałem tę definicjęhead

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

i to dlastailq_entry

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

Zgadujęhead jest typustruct 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>

questionAnswers(1)

yourAnswerToTheQuestion