Usando macros em C para definir estruturas de dados

Estou tentando entender o conceito de usar macros para definir operações de estrutura de dados. O código a seguir é um exemplo simples para usar a biblioteca de listas embutida no FreeBSD. Na biblioteca, todas as operações são definidas como macros. Eu já vi essa abordagem em algumas outras bibliotecas também.

Eu posso ver que isso tem algumas vantagens, por exemplo. Sendo a capacidade de usar qualquer estrutura de dados como um elemento na lista. Mas eu não entendo muito bem como isso funciona. Por exemplo:

O que éstailhead? Isso parece ser "apenas" definido.Como passarhead eentries para uma função?Que tipo éhead, como posso declarar um ponteiro para isso?

Existe um nome padrão para essa técnica que eu possa usar para pesquisar o google ou qualquer livro que explique esse conceito? Quaisquer links ou boas explicações sobre como esta técnica funciona serão muito apreciados.

Graças aNiklas B. Irãgcc -E e tenho essa definição parahead

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

e isso parastailq_entry

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

Então eu achohead é do tipostruct 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