【问题标题】:Macro for iterating over a GList用于迭代 GList 的宏
【发布时间】:2009-10-23 05:50:06
【问题描述】:

我正在使用 GLib 的双向链表结构 GList。我想知道是否有任何 standard 宏用于迭代 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)

【问题讨论】:

  • 我很确定 GLib 只提供用于迭代其各种数据结构的 foreach 函数。我同意,它的可读性并不总是很好 - 尽管回调的描述性名称通常对我来说看起来不错。

标签: c macros glib


【解决方案1】:

没有这样的宏。

我通常使用for 循环,就像您的示例中一样,除非操作跨越超过 15 行,在这种情况下,我通常会发现带有描述性名称的额外 foreach 函数比替代方法更具可读性。

您可能没有意识到,您不一定要编写自己的 foreach 函数:

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

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

【讨论】:

  • 注意:为了释放一个列表,Glib 现在提供 g_list_free_full(), developer.gnome.org/glib/2.28/… 。这对于释放一个完整的列表可能更惯用(尽管我猜它在内部做同样的事情)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多