首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在内核.h的最小宏中,"(void) (&_min1 == &_min2)“的作用是什么?

在内核.h的最小宏中,"(void) (&_min1 == &_min2)“的作用是什么?
EN

Stack Overflow用户
提问于 2011-04-08 21:16:52
回答 3查看 9.3K关注 0票数 62

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);这行是做什么的。这是某种类型检查还是什么?

EN

回答 3

Stack Overflow用户

发布于 2014-11-03 23:49:23

include/linux/kernel.h中的代码将此称为“不必要的”指针比较。这实际上是一个严格的类型检查,确保xy的类型相同。

此处的类型不匹配将导致编译错误或警告。

票数 19
EN

Stack Overflow用户

发布于 2014-11-03 23:50:10

找到答案here

“这与类型检查有关。做一个简单的程序:

int x = 10; 
long y = 20; 
long r = min(x, y); 

给出以下警告:警告:不同指针类型的比较缺少强制转换“

票数 4
EN

Stack Overflow用户

发布于 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的黑客攻击。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5595593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档