次のような for ループがあったとする。
for (elem = next(set); next(set) != NULL; elem = next(set)) {
// do something ...
}
こういうときは次のようなマクロを定義しておくと見通しがよくなる。
#define foreach(elem, set) \
for ((elem) = next(set); next(set) != NULL); (elem) = next(set))
foreach (elem, set) {
// do something ...
}
個人的には定石かなと思っていて、Cであってもちょっとモダンな感じになるので気に入っている。
この書き方は色々応用が効いて、次のようなマクロを定義してみても面白いかもしれない。
#define foreach_except0(elem, set) \
for ((elem) = next(set); next(set) != NULL); (elem) = next(set)) \
if ((elem) != 0)
foreach_except0 (elem, set) {
// do something ...
}
ただしやっぱりマクロに過ぎないので濫用はしないこと。