Я использую структуру 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)