免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5301 | 回复: 16
打印 上一主题 下一主题

(void)(&x == &y)一问? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-21 19:52 |只看该作者 |倒序浏览
现在知道(void)(&x == &y)是检查类型用的,但不明白为啥?
&x,&y 应该都是地址,怎么产生的警告?(void)似乎有没有都能产生警告,那它又起什么作用?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-04-21 20:57 |只看该作者
能不能给出更详细的信息?
干嘛都让我们猜呢?

论坛徽章:
0
3 [报告]
发表于 2006-04-21 21:46 |只看该作者
#define min(x,y) ({ \
        typeof(x) _x = (x);        \
        typeof(y) _y = (y);        \
        (void) (&_x == &_y);                \
        _x < _y ? _x : _y; })

int main()
{
      min(3.2, 3);
      return 0;
}

$ gcc macro.c
macro.c: In function `main':
macro.c:17: warning: comparison of distinct pointer types lacks a cast

int main()
{
        int x = 3;
        float y = 3.2;

        (void) (&x == &y);
        return 0;
}

和上面一样的警告。理解不了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-04-21 22:18 |只看该作者
它们两个类型不同,有告警很正常呀。

论坛徽章:
0
5 [报告]
发表于 2006-04-21 22:54 |只看该作者
原帖由 blueprint 于 2006-4-21 21:46 发表
#define min(x,y) ({ \
        typeof(x) _x = (x);        \
        typeof(y) _y = (y);        \
        (void) (&_x == &_y);                \
        _x < _y ? _x : _y; })

...


写这个宏的人考虑了如下几个问题:
1、如何避免带参宏的副作用。
2、如果两个入参类型不同,作者不能保证在这种情况下得到预期的比较结果,于是以一种编译器能够识别的方式“制造”出警告信息。类似于#error的用法。
3、通过void显式丢弃一个表达式的值,否则有些编译器会就此给出警告信息。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-04-21 22:56 |只看该作者
原帖由 雨丝风片 于 2006-4-21 22:54 发表


写这个宏的人考虑了如下几个问题:
1、如何避免带参宏的副作用。
2、如果两个入参类型不同,作者不能保证在这种情况下得到预期的比较结果,于是以一种编译器能够识别的方式“制造”出警告信息。类似于#erro ...

我想知道有几个编译器支持typeof?

论坛徽章:
0
7 [报告]
发表于 2006-04-21 22:59 |只看该作者
原帖由 lenovo 于 2006-4-21 22:56 发表

我想知道有几个编译器支持typeof?


俺只知道gcc。。。不过是属于扩展范畴嘀

[ 本帖最后由 雨丝风片 于 2006-4-21 23:00 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-04-21 23:03 |只看该作者
原帖由 雨丝风片 于 2006-4-21 22:59 发表


俺只知道gcc。。。不过是属于扩展范畴嘀

呵呵,我也是知道就gcc有,
估计别的都没有。
没法换编译器了。

论坛徽章:
0
9 [报告]
发表于 2006-04-21 23:07 |只看该作者
原帖由 lenovo 于 2006-4-21 23:03 发表

呵呵,我也是知道就gcc有,
估计别的都没有。
没法换编译器了。



根据gcc的特点,一般来说,不同版本的gcc基本上可以理解为“不同的”编译器,因为公司每次升级gcc版本都会带来相当大的代码修改工作量,主要就是这些警告信息。总的趋势是,gcc越来越像lint了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-04-21 23:09 |只看该作者
原帖由 雨丝风片 于 2006-4-21 23:07 发表



根据gcc的特点,一般来说,不同版本的gcc基本上可以理解为“不同的”编译器,因为公司每次升级gcc版本都会带来相当大的代码修改工作量,主要就是这些警告信息。总的趋势是,gcc越来越像lint了。

很大的代码修改工作量?
不是吧,如果代码符合标准,
应该没那么多吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP