2009-10-23 26 views
10

GLibの二重リンクリスト構造GListを使用しています。私は、標準マクロがGListを反復するためにあるかどうかを知りたいと思います。私はGLibのドキュメントでそのようなものを見つけることができませんでした。その結果、私は自分のマクロを作ったが、もしあれば、何か標準的なものを使うだろう。GListを反復処理するマクロ

問題を説明するために:それはあまりうるさいです

GList *list; 
MyType *item; 

GFOREACH(item, list) { 
    /* do something with item */ 
} 

に減少させることができるマクロで

GList *list, *elem; 
MyType *item; 

for(elem = list; elem; elem = elem->next) { 
    item = elem->data; 
    /* do something with item */ 
} 

:通常私はこのようになります多くのコードを記述します。


注:私は、コールバックが唯一である場合は特に、GLibのリストを反復処理し、各要素のためのコールバックを呼び出すためのforeachの機能を提供しますが、多くの場合、コールバックの間接が読みコードが難しくなりますことに気づきました一度使用。


更新:標準的なマクロがないので見て、私はそれが誰か他の人への使用である場合には、ここで使用していたマクロを入れています。訂正/改善を歓迎します。

+0

GLibは、さまざまなデータ構造を反復処理するforeach関数しか提供していません。私は同意します。コールバックのわかりやすい名前が付いていても、大体は大丈夫ですが、可読性の面で必ずしも優れているとは限りません。 – Cascabel

答えて

6

マクロはありません。

私は通常、あなたの例のようにループを使用しています。例えば、15行以上の場合は、わかりやすいforeach関数が代わりに読みやすくなります。

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

は、リスト内の各項目を解放し、私は頻繁に使用する操作:

はあなたが気づいていない可能性がありすることは、必ずしもあなた自身のforeach関数を記述する必要がないことです。

+2

注:リストを解放するため、Glibはg_list_free_full()、http://developer.gnome.org/glib/2.28/glib-Doubly-Linked-Lists.html#g-list-free-fullを提供しています。それはおそらく完全なリストを解放するためにもっと慣用的です(私はそれが内部的に同じことをすると思いますが)。 – sleske

関連する問題