C言語での foreach の実装について


C言語で foreach のような配列処理をするにはどうすればよいだろうと思い調べてみたところ、  
下記のようなマクロが紹介されているページを見つけました。

[C 言語: foreach マクロを利用する](https://blog.sarabande.jp/post/59731422637)

>
[code]

>     #define foreach(item, array) \
>     for (int keep = 1, \
>         count = 0,\
>         size = sizeof (array) / sizeof *(array); \
>         keep && count != size; \
>         keep = !keep, count++)  \
>         for (item = (array) + count; keep; keep = !keep) \
>  
[/code]

上記のコードを動かしてみた所、期待通りの動作をしてくれたのですが  
読み解こうとしたところ疑問点がありまして、２点、質問させてください。

  1. このマクロは Linux Kernel で定義されているとのことですが、どのファイルで定義されているかお分かりになる方いらっしゃいますでしょうか？

  2. このマクロの１つ目の for の条件式に keep && が必要な理由がわかりません。  
keep は 2つ目の for を1回だけ実行するために必要な条件だと理解しましたが、だとすると、 1つ目の for の条件式評価時に keep が 0
になることはあり得ないような気がします。  
この keep && は何を意図しての記載なのでしょうか？

もしかしたら読み違いでとんちんかんな質問をしておりましたらすみません。




外側のforループでkeepをテストしているのは、中のforループをbreakしたときに外側のforループも抜けるためじゃないでしょうか?

