偶然在<./linux/include/linux/kernel.h>里面看到下面这个宏定义:
#define min(x, y) /
({ /
typeof(x) _min1 = (x); /
typeof(y) _min2 = (y); /
(void) (&_min1 == &_min2); /
_min1 < _min2 ? _min1 : _min2; /
})
这就是一个泛型宏。使用了GCC的扩展支持命令typeof()
。一共四行代码,其他都很明了,唯独第三行让人有点摸不着头脑。
我第一反应这是为了防止编译器优化代码结构而添加的语句。但是回头想了一下,没有想出理由来。也就没在意了。
今天一个很突然的机会才反应过来这么做的原因:为防止不同类型变量进行比较。
int main(int ac, char** av)
{
char i = 100;
long j = 1000;
long k = min(i, j);
return 0;
}
编译上述代码时编译器会给出警告:comparison of distinct pointer types lacks a cast
如果去掉(void) (&_min1 == &_min2)
这行,再编译是不会给出警告的。
这群写内核人太TMD牛X了。