为什么FreeBSD没有CIRCLEQ_*
最近在看 Berkeley DB,发现一套 FreeBSD 上没有的宏, CIRCLEQ_*。
看了一下,这组宏是来自 4.4BSD 的,因此 FreeBSD 曾经有过这个宏;后来, phk 在 2000 年 12 月 29 日从 FreeBSD 里面把它拿掉了(SVN revision 70469),当时的说明如下:
CIRCLEQs are a disgrace to everything Knuth taught us in Volume 1 Chapter 2.
Retire them before anybody starts to use them again.
Use TAILQ instead, it provides the same functionality.
这个说的并不是很明确。查了一下,果然当时引起过争议(反对的意见主要是认为这会导致无法从 NetBSD 和 OpenBSD 移植代码,而另一方面,这被认为是 4.4BSD API 的一部分)。
Kirk McKusick(queue.h的作者)随后表示 支持 这一变动。具体的原因是 CIRCLEQ 的所有的功能,都可以用 TAILQ 以更高效的方式实现(因为 TAILQ 产生的 比较 操作更少)。
在移植代码时,只需简单地将 CIRCLEQ 替换为 TAILQ 即可。需要注意的是,如果代码中有绕过宏进行的操作,则需要进行相应的变动。