2012-04-21 14 views
6

Estoy tratando de comprender la API de la lista de enlaces del kernel de Linux.Diferencia entre LIST_HEAD_INIT y INIT_LIST_HEAD

Según Linux Kernel Linked List debería inicializar la cabeza de lista por INIT_LIST_HEAD pero here (Linux Kernel Program) se sugiere utilizar LIST_HEAD_INIT lugar.

Aquí hay un código de trabajo que escribí, pero no estoy seguro si lo hice de la manera adecuada. ¿Alguien podría verificar que está bien?

#include <stdio.h> 
#include <stdlib.h> 
#include "list.h" 

typedef struct edge_attr { 
     int d; 
     struct list_head list; 
} edge_attributes_t; 

typedef struct edge { 
     int id; 
     edge_attributes_t *attributes; 
} edge_t; 

int main() { 
     int i; 
     struct list_head *pos; 
     edge_attributes_t *elem; 
     edge_t *a = (edge_t*)malloc(sizeof(edge_t)); 

     a->id = 12; 
     a->attributes = (edge_attributes_t*) malloc(sizeof(edge_attributes_t)); 

     INIT_LIST_HEAD(&a->attributes->list); 

     for (i=0; i<5; ++i) { 
       elem = (edge_attributes_t*)malloc(sizeof(edge_attributes_t)); 
       elem->d = i; 
       list_add(&elem->list, &a->attributes->list); 
     } 

     list_for_each(pos, &(a->attributes->list)) { 
       elem = list_entry(pos, edge_attributes_t, list); 
       printf("%d \n", elem->d); 
     } 

     return 0; 
} 
+0

o maby a-> atrributes debería ser solo encabezado de lista, no entrada de lista? – patseb

Respuesta

10

Una rápida LXR clave:

#define LIST_HEAD_INIT(name) { &(name), &(name) } 

static inline void INIT_LIST_HEAD(struct list_head *list) 
{ 
     list->next = list; 
     list->prev = list; 
} 

Así INIT_LIST_HEAD consigue un struct list head * y lo inicializa, mientras LIST_HEAD_INIT devuelve la dirección del puntero pasado en una moda adecuado para su uso como un inicializador para una lista :

struct list_head lst1; 
/* .... */ 
INIT_LIST_HEAD(&lst1); 



struct list_head lst2 = LIST_HEAD_INIT(lst2); 
+0

struct list_head lst1; INIT_LIST_HEAD (&lst1); devuelve el error: 'struct list_head' no tiene ningún miembro llamado 'list' – patseb

17

LIST_HEAD_INIT es un inicializador estático, es un INIT_LIST_HEAD función. Ambos inicializan un list_head para estar vacío.

Si está estáticamente declarar una list_head, se debe utilizar LIST_HEAD_INIT, por ejemplo:

static struct list_head mylist = LIST_HEAD_INIT(mylist); 

Debe utilizar INIT_LIST_HEAD() para una cabeza de lista que se asigna de forma dinámica, por lo general parte de otra estructura. Hay muchos ejemplos en la fuente del kernel.