用于迭代GList的宏

前端之家收集整理的这篇文章主要介绍了用于迭代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)

解决方法

没有这样的宏.

我通常使用一个for循环,就像在你的例子中一样,除非这个操作跨越了十五行,在这种情况下,我通常会发现一个具有描述性名称的额外foreach函数比替代方法更可读.

你可能没有意识到,你不一定要写自己的foreach功能

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

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

猜你在找的C&C++相关文章