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)
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top