我正在使用 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)