|
蓝森林 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 在其中的作用,为何要测试这个地址相等?
请指教---- |
| |