Domanda

Sto usando la struttura di elenco doppiamente collegata di GLib, GList. Vorrei sapere se esiste una macro standard per iterare su un GList. Non ho trovato nulla del genere nella documentazione GLib. Di conseguenza ho creato la mia macro, ma preferirei usare qualcosa di standard se esiste.

Per illustrare il problema: di solito scrivo un sacco di codice che assomiglia a questo:

GList *list, *elem;
MyType *item;

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

Con una macro può essere ridotta a

GList *list;
MyType *item;

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

Che è molto meno rumoroso.


Nota: mi sono reso conto che GLib fornisce una funzione foreach per scorrere su un elenco e chiamare un callback per ogni elemento, ma spesso l'indirizzamento di un callback rende il codice più difficile da leggere, specialmente se il callback viene usato solo una volta.


Aggiornamento: visto che non esiste una macro standard, inserisco la macro che sto usando qui nel caso sia utile a qualcun altro. Correzioni / miglioramenti sono ben accetti.

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

Soluzione

Non esiste tale macro.

Di solito uso un ciclo per come nel tuo esempio a meno che l'operazione non superi più, per esempio, quindici righe, nel qual caso trovo che una funzione foreach extra con un nome descrittivo sia più leggibile rispetto all'alternativa.

Quello che potresti non capire è che non devi necessariamente scrivere la tua funzione foreach:

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

libera ogni elemento nell'elenco, un'operazione che utilizzo spesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top