加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于迭代GList的宏

发布时间:2020-12-16 05:33:45 所属栏目:百科 来源:网络整理
导读:我正在使用GLib的双向链表,GList.我想知道是否有任何标准的宏迭代GList.我在GLib文档中找不到任何这样的东西.结果我做了自己的宏,但如果存在,我宁愿使用标准的东西. 说明这个问题:通常我写了很多代码,看起来像这样: GList *list,*elem;MyType *item;for(el
我正在使用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);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读