为什么FreeBSD没有CIRCLEQ_*

• 本文约 324 字,阅读大致需要 1 分钟 | Development | #algorithm | #API | #BSD | #FreeBSD | #OpenBSD

最近在看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即可。需要注意的是,如果代码中有绕过宏进行的操作,则需要进行相应的变动。