C 用于在GList上迭代的宏
我正在使用GLib的双链表结构GList。我想知道是否有任何用于迭代GList的标准宏。我在油嘴滑舌的文档中找不到这样的东西。因此,我制作了自己的宏,但如果它存在,我宁愿使用标准的东西 为了说明这个问题:通常我写了很多代码,如下所示:C 用于在GList上迭代的宏,c,macros,glib,C,Macros,Glib,我正在使用GLib的双链表结构GList。我想知道是否有任何用于迭代GList的标准宏。我在油嘴滑舌的文档中找不到这样的东西。因此,我制作了自己的宏,但如果它存在,我宁愿使用标准的东西 为了说明这个问题:通常我写了很多代码,如下所示: GList *list, *elem; MyType *item; for(elem = list; elem; elem = elem->next) { item = elem->data; /* do something with ite
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);
释放列表中的每个项目,这是我经常使用的操作。我很确定GLib只提供foreach函数,用于迭代其各种数据结构。我同意,它的可读性并不总是很好——尽管回调的描述性名称对我来说通常没问题。注意:对于释放列表,Glib现在提供了g_list_free_full()。对于释放一个完整的列表来说,这可能更为惯用(尽管我猜它在内部也做同样的事情)。