关于(void)(&min1 == &min2)的问题和宏define min(a, b)
来源:互联网 发布:php静态调用方法 编辑:程序博客网 时间:2024/06/05 07:07
宏定义:
#define min(x, y) /
({ /typeof(x) _min1 = (x); /
typeof(y) _min2 = (y); /
(void) (&_min1 == &_min2); /
_min1 < _min2 ? _min1 : _min2; /
})
而第三行:(void)(&_min1 == &_min2) 是:为防止不同类型变量进行比较
int main(int ac, char** av)
{
char i = 100;
long j = 1000;
long k = min(i, j);
return 0;
}
编译上述代码时编译器会给出警告:comparison of distinct pointer types lacks a cast
如果去掉(void) (&_min1 == &_min2) 这行,再编译是不会给出警告的。
------------------------------------------------------
#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;
}
------------------------------------------------------
#include <stdio.h>
/*
* 检测变量类型是否相同
* (void) (&_min1 == &_min2);
*/
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
int main ()
{
int ret;
int i;
char j;
ret = min(i, j);
printf("ret = %d\n", ret);
return 0;
}
------------------------------------------------------
#include <stdio.h>
/*
* 防止类似i++类型的参数,被重复计算
* typeof(x) _min1 = (x);
*/
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
int main ()
{
int ret;
int i = 100;
int j = 200;
ret = min(i++, j++);
printf("ret = %d\n", ret);
return 0;
}
------------------------------------------------------
#include <stdio.h>
/*
* 这种写法,利用了do while的巧妙之处,但是也有最大一个缺憾,无法获得该宏的返回值;
* 如果只想实现一组语句的正确执行,而不关心其返回值,可以使用do while;
* 但是如果想获取这组语句的返回值,则必须使用()和{},将返回值放在最后一句。
*/
#define min(x, y) \
do { \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; \
} while (0)
int main ()
{
min(10, 30);
return 0;
}
------------------------------------------------------
#include <stdio.h>
int main ()
{
int i;
char j;
/*
* 通过下面测试证明,取址操作获取的地址是有类型的
* &i 获取的地址类型为 int *
* &j 获取的地址类型为 char *
*/
printf("&i = %p\n", &i);
printf("&i+1 = %p\n", &i+1);
printf("&j = %p\n", &j);
printf("&j+1 = %p\n", &j+1);
(void)(&i == &j);
return 0;
}
$ gcc test.c
test.c: 在函数‘main’中:
test.c:17: 警告: 比较不相关的指针时缺少类型转换
$ ./a.out
&i = 0xbfeccbac
&i+1 = 0xbfeccbb0
&j = 0xbfeccbb3
&j+1 = 0xbfeccbb4
- 关于(void)(&min1 == &min2)的问题和宏define min(a, b)
- 有以下宏定义, #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 请写出一种不能正确返回的情况?
- 关于b=~a的问题解析
- #define ADD(a,b) a+b 的问题
- 关于void a;和void *a;
- A的跳转关于void和#
- 关于typedef和define的一种理解方式,typedef void(*Fun)(void);
- 经典问题a+=b和a=a+b
- 交换两个数的值(使用中间变量和不使用中间变量的情况void main() { int a=1,b=3; //swap1(&a,&b); swap2(&a,&b); printf("a=%d, b=%)
- 面试问题a+=b 和a=a+b的区别
- (C)理解 #define write(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
- #define SIG_ERR (void(*)())-1 的问题
- 关于b=++b和b = b += 1的问题探讨
- min()的宏定义中的(void) (&_x == &_y)的含义
- min()的宏定义中的(void) (&_x == &_y)的含义
- min()的宏定义中的(void) (&_x == &_y)的含义
- Linux min()的宏定义中的(void) (&_x == &_y)的含义
- 关于类构造函数的问题+ void*的用法+#define构造泛型
- 图文解说:Nginx+tomcat配置集群负载均衡
- 内核启动参数祥解
- ClamAV学习【1】——ClamAV流程
- sendfile 和epool
- linux 显卡不匹配,花屏问题
- 关于(void)(&min1 == &min2)的问题和宏define min(a, b)
- 魅族MX和M9:Android4.0原生固件公测版发布
- 南开100题——用对象化作出(1题)
- 用socket实现简单的文件传输
- office VSTO 网址
- 实现解析数据table表最后的点击显示更多数据的代码
- 这是看到一.net高手的写作,记录下来以便参考
- 超酷概念版iPod Nano
- macos如何隐藏文件,显示隐藏文件