【问题标题】:Having diffculties in understanding in c code难以理解 c 代码
【发布时间】:2016-06-30 05:51:44
【问题描述】:

抱歉,我在 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

抱歉,这可能需要一些时间让您获得完整的代码。

【问题讨论】:

    标签: c openvswitch


    【解决方案1】:

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

    带有&(ITER)->MEMBER != (LIST) 的第三行将LIST 指向的指针与MEMBER 的地址进行比较,MEMBERITER 指向的结构的一部分。

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

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

    【讨论】:

    • 非常感谢。我猜到了同样的事情,但不确定。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2020-06-05
    • 2022-01-05
    • 2014-07-12
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多