#define max(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x > _y ? _x : _y; })
typeof(x)的意思是取x的类型,这不是标准C里的,gcc支持,vc不支持
(void) (&_x == &_y);这句话本身从执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。通过void显式丢弃一个表达式的值,否则有些编译器会就此给出警告信息。
---------------------
作者:深度思索
来源:CSDN
原文:https://blog.csdn.net/haozhao_blog/article/details/26284909
版权声明:本文为博主原创文章,转载请附上博文链接!
#include <stdio.h>
/* 使用该宏时,如果不关心返回值,没有圆括号()也可以,但是{}是必须的 */
#define min(x, y) { \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; }
int main ()
{
min(10, 20);
if (1)
min(10, 20);
return 0;
}
------------------------------------------------------
#include <stdio.h>
/*
* 用该宏时,如果关心返回值,就必须要圆括号()
* 最后一句是该宏的返回值
*/
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
int main ()
{
int ret;
ret = min(10, 20);
printf("ret = %d\n", ret);
return 0;
}
参考自:https://blog.csdn.net/u012749896/article/details/16347185