Question

J'utilise la structure de liste à double liaison de GLib, GList. J'aimerais savoir s'il existe une macro standard permettant d'effectuer une itération sur une liste GList. Je n'ai rien trouvé de tel dans la documentation de GLib. En conséquence, j'ai créé ma propre macro, mais je préfère utiliser quelque chose de standard s'il existe.

Pour illustrer le problème: en général, j'écris beaucoup de code qui ressemble à ceci:

GList *list, *elem;
MyType *item;

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

Avec une macro, cela peut être réduit à

GList *list;
MyType *item;

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

Ce qui est beaucoup moins bruyant.

Remarque: je me suis rendu compte que GLib fournissait une fonction foreach pour parcourir une liste et appeler un rappel pour chaque élément, mais l'indirection d'un rappel rend souvent le code plus difficile à lire, surtout si le rappel n'est utilisé qu'une seule fois. / p>

Mise à jour: comme il n’existe pas de macro standard, je mets ici la macro que j’utilise ici au cas où elle serait utile à quelqu'un d’autre. Les corrections / améliorations sont les bienvenues.

#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
Était-ce utile?

La solution

Il n’existe pas de telle macro.

J'utilise généralement une boucle pour comme dans votre exemple, sauf si l'opération s'étend sur plus de quinze lignes, auquel cas je trouve généralement qu'une fonction foreach supplémentaire avec un nom descriptif est plus lisible. que l'alternative.

Ce que vous ne réalisez peut-être pas, c'est que vous ne devez pas nécessairement écrire votre propre fonction foreach:

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

libère chaque élément de la liste, opération que j'utilise souvent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top