Uso de macros en C para definir estructuras de datos.

Estoy tratando de envolver mi cabeza en torno al concepto de usar macros para definir operaciones de estructura de datos. El siguiente código es un ejemplo simple para usar la biblioteca de listas incorporada en FreeBSD. En la biblioteca todas las operaciones se definen como macros. He visto este enfoque en un par de otras bibliotecas también.

Puedo ver que esto tiene algunas ventajas, por ejemplo. siendo la habilidad de usar cualquier estructura de datos como un elemento en la lista. Pero no entiendo muy bien cómo funciona esto. Por ejemplo:

Que esstailhead? Esto parece estar "justamente" definido.Cómo pasarhead yentries a una función?Que tipo eshead, ¿cómo puedo declarar un puntero a ella?

¿Hay un nombre estándar para esta técnica que pueda usar para buscar en google o algún libro que explique este concepto? Cualquier enlace o buena explicación sobre cómo funciona esta técnica será muy apreciada.

Gracias aNiklas B. corrígcc -E y obtuve esta definición parahead

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

y esto parastailq_entry

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

Así que supongohead es de 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>

Respuestas a la pregunta(1)

Su respuesta a la pregunta