gpt4 book ai didi

c - 一些链表C宏的问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:45 25 4
gpt4 key购买 nike

我正在查看两个链表实现(queue.h [ source ] 和 utlist.h [ source ]),我对它们各自的实现有几个问题:

  1. queue.h 中的_Q_INVALIDATE 是什么?我想这是一些调试的一部分,但我并不真正理解宏 define 逻辑。
  2. 两种实现方式都提供了 FOREACHFOREACH_SAFE。前者很直接,但后者背后的逻辑是什么?另外,如果前者无论如何都不安全,那么为什么首先实现它?
  3. 为什么 queue.h 将其结构实现为具有不同类型的 nextprev (struct *le_nextstruct **le_prev)?
  4. 在这两种实现中,为什么到处插入额外的括号?例如。在 #define LIST_FIRST(head) ((head)->lh_first)
  5. 中围绕 head

最佳答案

对于问题 1:

_Q_INVALIDATE 是一个宏,它设置了一个指针,该指针不应再用于 -1 的值。目的是如果随后使用它,调试将变得更容易,因为使用指针会导致立即崩溃。在非 Debug模式下,宏不执行任何操作,因此指针保留其当前值 - 如果存在导致使用指针的错误,则问题可能是更微妙的缺陷。

对于问题2:

这些宏的“安全”版本采用额外的指针参数,宏在处理当前项时在内部使用该指针参数指向列表中的下一项。这允许循环内的代码从列表中删除当前项目。由于临时指针中已经记住了下一项,因此宏可以毫无问题地为下一次迭代选取它。宏的非安全版本不使用临时指针,因此您无法在迭代时从列表中删除当前项。

对于问题 3:

这使得在当前元素之前添加新元素或从列表中删除当前元素变得更加容易,而无需担心当前元素是否位于列表的头部(因此仅由列表“指向”指针)或者如果当前元素在列表中的其他位置(因此被另一个元素的 le_next 指针指向)。如果 le_prev 是一个 struct type*,那么处理列表中的第一个元素将需要特殊情况代码。由于 le_prev 是一个 struct type**,它可以引用一个简单的 struct type*(就像列表头指针)一样容易struct type* 嵌入在 type 中的某个任意偏移处(如每个元素中的 le_next 链接)。

问题 4 在上面的评论中得到了回答。

关于c - 一些链表C宏的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16604040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com