c语⾔求最⼩值函数min的⽤法,C语⾔--min的宏定义
近⽇⽆意间发现,关于常见的min的宏定义,在Linux中是这样的:
/*
* min()/max()/clamp() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x, y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x
关于其中的:
(void) (&_x == &_y);
很是疑惑,表⾯看起来,这句话,好像不起作⽤,算是⼀句废话,所以去了⼀下别⼈的解释,才⼤概搞懂是啥意思。
⾸先,我们此处想要实现的⽬ 的是,在计算两个数的最⼩值之前,希望去判断⼀下两个值的类型是否⼀致,⽽由于C语⾔本⾝不⽀持我们去做类似于这样的操作 typeof(_x)==typeof(_y),所以在此,通过故意判断他们2个的地址指针是否相等,⽽显然&_x,即x的地址,是不可能等于& amp;_y的,但是这句话(void) (&_x == &_y);使得,如果_x和_y的类型不⼀样,其指针类型也会不⼀样,2个不⼀样的指针类型进⾏⽐较操作,则会引起编译器产⽣⼀个编译警告,提⽰ 你这两个值的类型不同。
⽐如,如果你编译下⾯这段代码:
intx = 2;
chary = 3;
intm;
m = min(x,y);
编译的时候,经过预处理后,就会有这样的判断操作:
int * == char *;
因此编译器就会提⽰你:
warning: comparison of distinct pointer types lacks a cast
所以,这个宏的巧妙之处就在于此。
所以,总结起来就是:
【提⽰】
1。其实关于min的宏,更好的做法是再加个const,即:
#define min(x, y) ({ \
consttypeof(x) _x = (x); \
consttypeof(y) _y = (y); \
(void) (&_x == &_y); \
_x
2。(void) (&_x == &_y); 中的void,表⽰将表达式(&_x == &_y); 所得到的结果(此处肯定是逻辑上的假,值为0)忽略掉。如果不加void,则会提⽰你这⾏代码是⽆意义的,没⼈⽤到。
typeof的用法3。关于min的宏定义,为何这么复杂,⽽不是⽤简单的#define min(x,y) ((x) < (y) ? x : y)
因为,如果如此定义,那么对于⼀些特殊的值传⼊此宏之后,就会产⽣⼀些副作⽤,产⽣的结果,就不是我们想要的了,⽐如:
min(++a,++b) ==> ((++a)
就使得,a++和b++分别执⾏了2次,⽽且min的结果,也不对了。⽽⽤上⾯那个复杂的定义,多加了局部变量_x和_y,就可以避免此类问题了。
【引⽤】
1。(void) (&_x == &_y);
2。如下的宏定义中(void) (&_x == &_y);是怎么做到判断类型的?
3。Linux内核中的Min和Max函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论