12

私は 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 関数を提供していることに気付きましたが、コールバックの間接化により、特にコールバックが 1 回しか使用されない場合、コードが読みにくくなることがよくあります。


更新: 標準のマクロがないため、他の人に役立つ場合に備えて、使用しているマクロをここに入れます。修正/改善は大歓迎です。

#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
4

1 に答える 1

7

そのようなマクロはありません。

for操作がたとえば15行を超えない限り、私は通常、例のようなループを使用します。その場合、説明的な名前を持つ追加のforeach関数は、他の関数よりも読みやすいことがわかります。

気付かないかもしれませんが、必ずしも独自のforeach関数を作成する必要はありません。

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

リスト内の各アイテムを解放します。これは、私がよく使用する操作です。

于 2009-10-24T00:02:24.390 に答える