偶遇(void)(&_x == &_y)
在阅读linux内核代码时候,遇到如下宏定义:
1 #define min(x,y) ({ \
2 typeof(x) _x = (x); \
3 typeof(y) _y = (y); \
4 (void) (&_x == &_y); \
5 _x < _y ? _x : _y; })
这是GCC的扩展,语句表达式——GCC把包含在括号里头的复合语句看作是一个语句表达式,成为语句表达式,它允许在一个表达式内使用循环,跳转,局部变量,并可以出现在任何允许出现表达式的地方。位于括号中的最后一句必须是以一个分号结束的表达式,它的值就是这个语句表达式的值。对于上面的宏定义,比较疑惑的地方是
1 (void)(&_x == &_y)
这个地方。查阅了一下资料,觉得这主要是因为宏的定义者不敢保证在x和y类型不一样的情况下得到正确的结果,利用编译器对于“类型不一致的数据相互比较”会发出编译警告。如此一来,如果宏的使用者传入的两个参数类型不一致,编译器会给出警告信息。另外,使用void显示丢弃一个表达式的值,否则有些编译器会就此给出警告信息。
PS:与石头聊天记录:
rockics 14:10:42
(void) (&_x == &_y); 这句话有何用?
石头 14:36:54
写这句话的通常是废柴
没想到一直很崇拜的石头同学居然也如此的废@