关于struct Hack, 优雅的FreeBSD

TL;DR

我们对于struct hack熟知的是下面这种情况。
我们定义一个结构体family来记录一个正常家庭的人的年龄,显然对于一个正常家庭来说,爸妈各只有一个,但是孩子有多少就不确定了,所以我们把family的最后一个成员baby定义为了变长数组。对于这种在一个结构体里面最后一个变量是变长数组而且仅有这一个成员是变长数组的情况,我们称之为struct hack。这属于C语言里面的一个trick。
我这边博客要讨论的不是这种情况,我要说的是我在FreeBSD内核里面看到的一个很有意思的代码,也是一种struct的trick。它起的名字是struct __hack, 所以我就联想到了前面的struc hack :)

代码的规范性

在说FreeBSD内核的struct __hack之前,先来说下Linux内核里的do{ }while(0) 。 在我之前一个blog里,我说了 do{} while(0) 的目的是为了防止悬挂else问题。之所以会出现悬挂else问题,就是因为代码写的不是太规范。所以说,对于if/else,我们还是要尽量写成

1
2
3
4
5
if  ()  {
...
} else {
...
}

即使里面只有一句话。

struct __hack

然后在来看这个struct __hack

任何技术或者技巧的出现都是为了解决一些问题的,那么这里的struct __hack是为了解决什么问题哪? 其实它是用来告诉程序员这个宏只用作函数声明。我们知道函数声明一般都是下面这个样子:

1
void foobar(void);

这个宏也是为了模拟这种形式, 当然事实上它仍然是宏定义了一个函数, 这里要模拟,是说,它的函数体在别处。比如:

1
TASKQUEUE_DEFINE_THREAD(kqueue);

总之,这个小小的细节正体现出了FreeBSD所追求的优雅性.

闲扯

计算机这个东西本身就是美国的,凡事都是原汁原味的好,而且在绝大多数情况下,你面对的只有英文。比如对于一个C编译器的编译错误信息“discards qualifiers from pointer target type”, 如果你要Google一下才知道这是什么错误的话,那么恭喜你,码农的苦逼生活不适合你:)
其实反过来想也是这样。我在的小区附近老外特别多,旁边一个小区住着N多的韩国人。最近楼下新开了一家店,为了招徕老外,显然得起个英文名,它的英文名字叫“Chinese Humberger”,你猜它的中文名叫什么? 肉夹馍! 哈哈,很不伦不类,莫名其妙不是。所以说,原汁原味的才是最好的。

Comments