Подтвердить что ты не робот

Макро для итерации над 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)
4b9b3361

Ответ 1

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

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

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

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

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