0

申し訳ありませんが、AC コードで次のような問題が発生しています。3行目は何ですか:

#define LIST_FOR_EACH_SAFE(ITER, NEXT, MEMBER, LIST)               \
    for (INIT_CONTAINER(ITER, (LIST)->next, MEMBER);               \
         (&(ITER)->MEMBER != (LIST)                                \
          ? INIT_CONTAINER(NEXT, (ITER)->MEMBER.next, MEMBER), 1   \
          : 0);                                                    \
         (ITER) = (NEXT))

コード全体は、 https ://github.com/openvswitch/ovs/blob/ff261703821658243bba13c80311130d036eeb52/include/openvswitch/list.h にあります。

申し訳ありませんが、コード全体を取得するには時間がかかる場合があります。

4

1 に答える 1

1

これは関数ではなくマクロであるため、さまざまな変数が宣言でどのような型を持っているかはわかりません。ただし、2 行目では、next というメンバーを含む構造体へのポインターである(LIST)->nextと仮定しても安全であることがわかります。LIST

3 番目の行は、を指す&(ITER)->MEMBER != (LIST)このポインターを、を指す構造体の一部であるLISTアドレスと比較します。MEMBERITER

4 行目INIT_CONTAINER(NEXT, (ITER)->MEMBER.next, MEMBER)は、3 行目の比較が異なる場合にのみ呼び出されます。この呼び出しが行われた後1、for ループを続行するために使用される結果が得られます。

0行 3 での比較が等しい場合、代わりに 5 行目で結果を取得して for ループを終了します。

于 2016-06-30T06:15:20.503 に答える