質問

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)
役に立ちましたか?

解決

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

通常、例のように for ループを使用します。ただし、操作が15行を超える場合を除きます。代替よりも。

あなたが気付かないかもしれないのは、必ずしもあなた自身のforeach関数を書く必要がないということです:

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top