在kernel.h的minmacros中,“(void)(&_min1 ==&_min2)”的function是什么?
在kernel.h中, min被定义为:
#define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; })
我不明白是什么行(void) (&_min1 == &_min2);
确实。 是某种types的检查或什么?
该声明
(void) (&_min1 == &_min2);
是一个保证“不操作”。 所以它的唯一原因是它的副作用。
但是这个陈述没有副作用!
但是: 它会强制编译器在x
和y
的types不兼容时发出诊断 。
请注意,使用_min1 == _min2
进行testing会隐式地将其中一个值转换为另一个types。
所以,我想,这就是它的作用。 它在编译时validationx
和y
的types是兼容的 。
include / linux / kernel.h中的代码将此称为“不必要的”指针比较。 这实际上是一个严格的types检查,确保x
和y
的types是相同的。
types不匹配将导致编译错误或警告。
这提供了types检查,指针之间的相等应该在兼容的types之间,并且gcc
会在不是这样的情况下提供警告。
我们可以看到,指针之间的平等要求指针是来自C99标准草案部分的兼容types 6.5.9
平等运算符 ,它表示:
下列其中一项应为:
包括:
两个操作数都是指向兼容types的合格版本或非限定版本的指针;
我们可以从6.2.7
节的兼容types和复合types中find一个兼容types :
如果types相同,则两种types具有兼容types
关于osnews的讨论也涵盖了这一点,它受到了Linux内核文章中GCC hack的启发,它具有相同的代码示例。 答案是:
与types检查有关。
制作一个简单的程序:
int x = 10; long y = 20; long r = min(x, y);
给出以下警告:警告:不同指针types的比较缺less强制转换
请参阅http://www.osnews.com/comments/20566其中解释:;
它与types检查有关。
制作一个简单的程序:
int x = 10; long y = 20; long r = min(x, y);
给出以下警告:警告:不同指针types的比较缺less强制转换
在这里find答案
“这与types检查有关。制作一个简单的程序:
int x = 10; long y = 20; long r = min(x, y);
给出以下警告:警告:不同指针types的比较缺less投射“
Linux内核充满了这样的东西(为了“types安全”和其他类似的考虑,没有免费的gcc特定的黑客),我会认为这是非常糟糕的做法,并敦促你不要效仿,除非有人要求你。
pmg是正确的黑客攻击的目的,但任何理智的人会将min
定义为((x)<(y)?(x):(y))
。
请注意,内核定义排除了许多正确的用法,例如一个参数是int
而另一个参数很long
。 我怀疑他们真正想要排除的是符号不匹配,例如min(-1,1U)
是1.更好的方式来声明这将是使用编译时断言((1?-1:(x))<0)==((1?-1:(y))<0)
。 请注意,这不需要任何gcc特定的黑客。