用于迭代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); 释放列表中的每个项目,这是我经常使用的操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |