在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);
这行是做什么的。这是某种类型检查还是什么?
发布于 2014-11-03 23:49:23
include/linux/kernel.h中的代码将此称为“不必要的”指针比较。这实际上是一个严格的类型检查,确保x
和y
的类型相同。
此处的类型不匹配将导致编译错误或警告。
发布于 2014-11-03 23:50:10
发布于 2011-04-08 21:46:53
Linux内核到处都是这样的东西(出于“类型安全”和其他类似的考虑,无端的针对gcc的黑客攻击),我认为这是非常糟糕的做法,并强烈建议您不要遵循它,除非有人要求您这样做。
pmg关于黑客攻击的目的是正确的,但任何理智的人都会将min
定义为((x)<(y)?(x):(y))
。
请注意,内核定义排除了许多正确的用法,例如,一个参数是int
,另一个参数是long
。我怀疑他们真正想要排除的是符号不匹配,例如min(-1,1U)
是1。断言这一点的更好方法是对((1?-1:(x))<0)==((1?-1:(y))<0)
使用编译时断言。请注意,这不需要任何特定于gcc的黑客攻击。
https://stackoverflow.com/questions/5595593
复制相似问题