在kernel.h中, min定义为:
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
Run Code Online (Sandbox Code Playgroud)
我不明白这行(void) (&_min1 == &_min2);是做什么的.是某种类型检查还是什么?
pmg*_*pmg 59
该声明
(void) (&_min1 == &_min2);
Run Code Online (Sandbox Code Playgroud)
是一个保证"无操作".所以唯一的原因是它的副作用.
但声明没有副作用!
但是:它强制编译器在类型x和y不兼容时发出诊断.
请注意,测试_min1 == _min2将隐式地将其中一个值转换为另一个类型.
所以,我猜,这就是它的作用.它在编译时验证类型x和y兼容性.
Has*_*kun 18
include/linux/kernel.h中的代码将此称为"不必要的"指针比较.这实际上是一种严格的类型检查,确保其类型x和y相同.
此处类型不匹配将导致编译错误或警告.
Sha*_*our 11
这提供了类型检查,指针之间的相等应该在兼容类型之间,并且gcc对于不是这样的情况将提供警告.
我们可以看到指针之间的相等性要求指针与草案C99标准部分Equality运算符中的兼容类型相同:6.5.9
以下其中一项应持有:
包括:
两个操作数都是指向兼容类型的限定或非限定版本的指针;
我们可以从兼容类型和复合类型中找到兼容类型的内容,其中说:6.2.7
如果类型相同,则两种类型具有兼容类型
关于osnews的讨论也涵盖了这一点,它的灵感来自Linux内核文章中具有相同代码示例的GCC hacks.答案是:
与类型检查有关.
制作一个简单的程序:
Run Code Online (Sandbox Code Playgroud)int x = 10; long y = 20; long r = min(x, y);给出以下警告:警告:不同指针类型的比较缺少强制转换
请参阅http://www.osnews.com/comments/20566,其解释如下:
它与类型检查有关.
制作一个简单的程序:
Run Code Online (Sandbox Code Playgroud)int x = 10; long y = 20; long r = min(x, y);给出以下警告:警告:不同指针类型的比较缺少强制转换