Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于在GList上迭代的宏_C_Macros_Glib - Fatal编程技术网

C 用于在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

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

为了说明这个问题:通常我写了很多代码,如下所示:

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()。对于释放一个完整的列表来说,这可能更为惯用(尽管我猜它在内部也做同样的事情)。