Макро для итерации над GList
Я использую структуру 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)
Ответы
Ответ 1
Нет такого макроса.
Обычно я использую цикл for
, как в вашем примере, если операция не превышает, скажем, пятнадцать строк, и в этом случае я обычно обнаруживаю, что дополнительная функция foreach с описательным именем более читаема, чем альтернатива.
Что вы можете не осознавать, так это то, что вам необязательно писать собственную функцию foreach:
g_list_foreach(list, (GFunc)g_free, NULL);
освобождает каждый элемент в списке, операцию, которую я часто использую.