Я использую структуру двойного связанного списка GLib, GList. Я хотел бы знать, существует ли какой-либо стандартный макрос для итерации по GList. Я не смог найти ничего подобного в документации GLib. В результате я создал свой собственный макрос, но я бы предпочел использовать что-то стандартное, если оно существует.
Чтобы проиллюстрировать проблему: обычно я пишу много кода, который выглядит следующим образом:
GList *list, *elem;
MyType *item;
for(elem = list; elem; elem = elem->next) {
item = elem->data;
/* do something with item */
}
С помощью макроса его можно уменьшить до
GList *list;
MyType *item;
GFOREACH(item, list) {
/* do something with item */
}
Что гораздо менее шумно.
Примечание: я понял, что GLib предоставляет функцию foreach для итерации по списку и вызова обратного вызова для каждого элемента, но часто косвенная обратная связь затрудняет чтение кода, особенно если обратный вызов используется только один раз.
Обновление: видя, что нет стандартного макроса, я помещаю используемый здесь макрос на случай, если он кому-нибудь пригодится. Исправления / улучшения приветствуются.
#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)