0

对不起,但我在交流代码中遇到以下困难。第三行是什么:

#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

这不是一个函数,而是一个宏,因此您不会在任何声明中看到不同变量的类型。但是,在第二行,您可以看到(LIST)->next它可以安全地假设它LIST是一个指向包含名为 next 的成员的结构的指针。

第三行 with&(ITER)->MEMBER != (LIST)将指向的这个指针与作为指向的结构的一部分LIST的地址进行比较。MEMBERITER

INIT_CONTAINER(NEXT, (ITER)->MEMBER.next, MEMBER)仅当第 3 行的比较不同时才调用第四行。在进行此调用之后1,是用于继续 for 循环的结果。

0如果第 3 行的比较相等,则在第 5 行,您将获得结束 for 循环的结果。

于 2016-06-30T06:15:20.503 回答