Pregunta

Estoy utilizando la estructura de lista doblemente enlazada de GLib, GList. Me gustaría saber si existe alguna macro estándar para realizar una iteración sobre un GList. No pude encontrar nada de eso en la documentación de GLib. Como resultado, he creado mi propia macro, pero prefiero usar algo estándar si existe.

Para ilustrar el problema: por lo general escribo un montón de código que se ve así:

GList *list, *elem;
MyType *item;

for(elem = list; elem; elem = elem->next) {
  item = elem->data;
  /* do something with item */
}

Con una macro se puede reducir a

GList *list;
MyType *item;

GFOREACH(item, list) {
  /* do something with item */
}

Lo que es mucho menos ruidoso.


Nota: Me di cuenta de que GLib proporciona una función foreach para iterar sobre una lista y llamar a una devolución de llamada para cada elemento, pero a menudo la indirección de una devolución de llamada hace que el código sea más difícil de leer, especialmente si la devolución de llamada solo se usa una vez. / p>


Actualización: dado que no hay una macro estándar, estoy poniendo la macro que estoy usando aquí en caso de que sea de alguna utilidad para otra persona. Las correcciones / mejoras son bienvenidas.

#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
¿Fue útil?

Solución

No hay tal macro.

Normalmente utilizo un for como en su ejemplo, a menos que la operación abarque más de, digamos, quince líneas, en cuyo caso generalmente encuentro que una función foreach adicional con un nombre descriptivo es más legible que la alternativa.

Lo que quizás no se dé cuenta es que no necesariamente tiene que escribir su propia función foreach:

g_list_foreach(list, (GFunc)g_free, NULL);

libera cada elemento de la lista, una operación que uso con frecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top