Макрос для перебора GList - PullRequest
       6

Макрос для перебора GList

11 голосов
/ 23 октября 2009

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

7 голосов
/ 24 октября 2009

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

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

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

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

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

...