2016-06-30 6 views
0

申し訳ありませんが、私はCコードで次のような問題があります。 3行目が何のためにあるのか:Cコードでの理解が難しい

#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

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

答えて

1

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

&(ITER)->MEMBER != (LIST)

と第3段目は、このポインタを比較し、そのLISTITERポイント点に構造の一部であるMEMBERのアドレスとします。

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

fift行では、結果として、行3の比較が等しい場合、forループを終了する結果が0になります。

+0

ありがとうございます。私は同じことを推測したが、わからなかった。ありがとうございました –

関連する問題