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