蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月6日 10:18


(void)(&x == &y)一问?

现在知道(void)(&x == &y)是检查类型用的,但不明白为啥?
&x,&y 应该都是地址,怎么产生的警告?(void)似乎有没有都能产生警告,那它又起什么作用?

能不能给出更详细的信息?
干嘛都让我们猜呢?:roll:

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

-->
我想知道有几个编译器支持typeof?:roll:

-->

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


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

-->


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

-->
很大的代码修改工作量?
不是吧,如果代码符合标准,
应该没那么多吧。:em06:

-->


应该还好吧,主要是一些在老版本中不会出警告的写法在新版本中就会出警告,比如著名的“##”问题,^_^

-->
(void)(&_x == &_y);
是不是说这儿&号不在是平常的取地址符,而是一种特殊标记?

就是取地址符

-->


还是没有明白 &_x == &_y 在其中的作用,为何要测试这个地址相等?
请指教----



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com