c - 迭代 GList 的宏

标签 c macros glib

我正在使用 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);

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

关于c - 迭代 GList 的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1611585/

相关文章:

c - 在辅助线程中调用 select()/pselect() 会导致主线程阻塞吗?

c++ - C++ 模板只是变相的宏吗?

java - 如何从 Java 运行 Microsoft Access 宏

c - 结构中的链表

c - 在 C 中传递可变数量参数的更紧凑方法

c - 如何导入 C 库?

在 OS X 上未检测到 glibmm-2.4 安装

c++ - 如何检测 VS C++ 编译器是否支持 C++11?

c - g_cond_wait() 的这个示例代码会导致未定义的行为吗?

c - GLib:哈希表无法正确找到值