用于迭代GList的宏

Jam*_*mes 11 c macros glib

我正在使用GLib的双链表结构,GList.我想知道是否有任何标准的宏来迭代GList.我在GLib文档中找不到任何这样的东西.结果我制作了自己的宏,但如果它存在,我宁愿使用标准的东西.

说明问题:通常我写了很多代码如下:

GList *list, *elem;
MyType *item;

for(elem = list; elem; elem = elem->next) {
  item = elem->data;
  /* do something with item */
}
Run Code Online (Sandbox Code Playgroud)

使用宏可以减少到

GList *list;
MyType *item;

GFOREACH(item, list) {
  /* do something with item */
}
Run Code Online (Sandbox Code Playgroud)

哪个不那么吵.


注意:我意识到GLib提供了一个foreach函数,用于迭代列表并为每个元素调用回调,但是回调的间接使得代码更难以读取,特别是如果回调仅使用一次.


更新:看到没有标准宏,我正在使用我在这里使用的宏,以防它对别人有用.欢迎更正/改进.

#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
Run Code Online (Sandbox Code Playgroud)

pto*_*ato 7

没有这样的宏.

我通常使用for类似于你的例子中的循环,除非操作跨越超过15行,在这种情况下,我通常会发现具有描述性名称的额外foreach函数比替代更具可读性.

您可能没有意识到的是,您不一定要编写自己的foreach函数:

g_list_foreach(list, (GFunc)g_free, NULL);
Run Code Online (Sandbox Code Playgroud)

释放列表中的每个项目,这是我经常使用的操作.

  • 注意:为了释放列表,Glib现在提供g_list_free_full(),http://developer.gnome.org/glib/2.28/glib-Doubly-Linked-Lists.html#g-list-free-full.这可能更适合释放完整列表(虽然我猜它在内部做同样的事情). (2认同)