我正在使用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函数,用于迭代列表并为每个元素调用回调,但通常回调的间接使代码更难读,特别是如果回调只使用一次。 / p>
更新:看到没有标准宏,我正在使用我在这里使用的宏,以防它对别人有用。欢迎更正/改进。
#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
答案 0 :(得分:7)
没有这样的宏。
我通常在你的例子中使用for
循环,除非操作跨越超过15行,在这种情况下我通常会发现带有描述性名称的额外foreach函数比替代方案更具可读性
您可能没有意识到的是,您不一定要编写自己的foreach函数:
g_list_foreach(list, (GFunc)g_free, NULL);
释放列表中的每个项目,这是我经常使用的操作。