Вопрос

Я использую структуру двойного связанного списка 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)
Это было полезно?

Решение

Нет такого макроса.

Я обычно использую цикл for , как в вашем примере, если только операция не занимает больше, скажем, пятнадцати строк, и в этом случае я обычно нахожу, что дополнительная функция foreach с описательным именем более читаема чем альтернатива.

Что вы можете не понимать, так это то, что вам не обязательно писать свою собственную функцию foreach:

g_list_foreach(list, (GFunc)g_free, NULL);

освобождает каждый элемент в списке, что я часто использую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top