Makro zum Durchlaufen über eine GList
Frage
Ich bin mit GLib der doppelt verknüpften Listenstruktur, GList. Ich würde gerne wissen, ob es ein Standard Makro über einen GList für iterieren. Ich konnte nicht so etwas in der GLib Dokumentation. Als Ergebnis habe ich mein eigenes Makro gemacht, aber ich würde lieber etwas Standard verwenden, wenn es vorhanden ist.
das das Problem zu veranschaulichen: In der Regel habe ich viel Code zu schreiben, die wie folgt aussieht:
GList *list, *elem;
MyType *item;
for(elem = list; elem; elem = elem->next) {
item = elem->data;
/* do something with item */
}
Mit einem Makro kann es zu reduzieren
GList *list;
MyType *item;
GFOREACH(item, list) {
/* do something with item */
}
Was ist viel weniger laut.
. Hinweis: Ich erkannte, dass GLib eine foreach-Funktion zur Iteration über eine Liste liefert und einen Rückruf für jedes Element aufrufen, aber oft der Indirektionsoperator eines Rückrufes macht den Code schwerer zu lesen, vor allem, wenn der Rückruf nur einmal verwendet wird
Update: da es kein Standard-Makro ist, ich stelle das Makro ich hier im Fall verwenden es sonst irgend jemand ist. Korrekturen / Verbesserungen sind willkommen.
#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
Lösung
Es gibt keine solche Makro.
ich in der Regel eine for
Schleife wie in Ihrem Beispiel verwenden, wenn der Betrieb als mehr umspannt etwa fünfzehn Zeilen, wobei ich in der Regel feststellen, dass eine zusätzliche foreach-Funktion mit einem beschreibenden Namen besser lesbar als die Alternative ist.
Was Sie vielleicht nicht wissen ist, dass man nicht unbedingt haben, um Ihre eigene foreach Funktion schreiben:
g_list_foreach(list, (GFunc)g_free, NULL);
befreit jedes Element in der Liste, eine Operation, die ich häufig verwenden.