搜索
bottom↓
回复: 15

keil 编译出现的警告pointless comparison of unsigned integer with ...

[复制链接]
(290653446)

出0入0汤圆

发表于 2012-11-6 22:23:41 | 显示全部楼层 |阅读模式
CHECK_PARAM(PARAM_I2C_SLAVEADDR_CH(OwnSlaveAddrConfigStruct->SlaveAddrChannel));

此语句为何出现警告warning:  #186-D: pointless comparison of unsigned integer with zero

宏定义:#define PARAM_I2C_SLAVEADDR_CH (   n )    ((n>=0) && (n<=3))

(290636052)

出0入0汤圆

发表于 2012-11-7 03:13:35 来自手机 | 显示全部楼层
unsigned int 必然大于等于零,这个逻辑运算的前半恒真。。。。
(290610856)

出0入0汤圆

 楼主| 发表于 2012-11-7 10:13:31 | 显示全部楼层
感谢楼上回复
还是没有明白楼上的意思
(290592962)

出0入0汤圆

发表于 2012-11-7 15:11:45 来自手机 | 显示全部楼层
19781011 发表于 2012-11-7 10:13
感谢楼上回复
还是没有明白楼上的意思

意思就是你把n>=0的=删了就没警告了
(290568216)

出0入0汤圆

 楼主| 发表于 2012-11-7 22:04:11 | 显示全部楼层
本帖最后由 19781011 于 2012-11-7 22:20 编辑

多谢楼上,删了果然没有警告了

只是还是不太明白这个宏定义的意思,如果n的取值范围在逻辑表达式的范围,是否就为真(1)呢?
如果n=0的话,将n>=0中的=删除,那表达式是否就不成立了呢
(290559019)

出0入0汤圆

发表于 2012-11-8 00:37:28 来自手机 | 显示全部楼层
19781011 发表于 2012-11-7 22:04
多谢楼上,删了果然没有警告了

只是还是不太明白这个宏定义的意思,如果n的取值范围在逻辑表达式的范围, ...

你需要复习c语言。。。。
(290558305)

出0入0汤圆

发表于 2012-11-8 00:49:22 | 显示全部楼层
无符号数是永远大于等于零的,编译器警告你 n >= 0 这样的写法是毫无意义的

(290528371)

出0入0汤圆

 楼主| 发表于 2012-11-8 09:08:16 | 显示全部楼层
jisaowang 发表于 2012-11-8 00:37
你需要复习c语言。。。。

手上有一本谭浩强的书,看了关于带有参数的宏定义一节,说的不是很多,所以对带有参数的宏定义还不是很清楚,请您指教
(290507496)

出0入0汤圆

发表于 2012-11-8 14:56:11 来自手机 | 显示全部楼层
把中国人写的书扔掉是你进步的第一步。。。。
(290501680)

出0入0汤圆

 楼主| 发表于 2012-11-8 16:33:07 | 显示全部楼层
暂时还没有能力和条件不看中国人写的书
请您指教
(290497334)

出0入0汤圆

发表于 2012-11-8 17:45:33 | 显示全部楼层
19781011 发表于 2012-11-8 16:33
暂时还没有能力和条件不看中国人写的书
请您指教

不看原版可以看翻译的阿。。。。

这个警告跟参数宏没什么关系,而是告诉你这个逻辑运算对于uint类型来说是无意义的。因为uint类型是从零开始的整数,那么自然在逻辑上必然〉=0,那么&&前半部分的逻辑判断就恒为真,那么自然就是无意义的了。
所以如果要将这个宏应用于uint类型,就会出这种警告咯,如果传入的是int类型,自然就没有了。。。。。
(290439884)

出0入0汤圆

 楼主| 发表于 2012-11-9 09:43:03 | 显示全部楼层
jisaowang 发表于 2012-11-8 17:45
不看原版可以看翻译的阿。。。。

这个警告跟参数宏没什么关系,而是告诉你这个逻辑运算对于uint类型来说 ...

这个警告我已经明白了

如果n是uint型的,即默认n不可能小于0,那(n>=0)&&(n<=3) 这个逻辑表达式的前半部恒真,是否(n>=0)这句可以省略呢

另外这个宏定义到底是什么意思?还望您赐教
(290417877)

出0入0汤圆

发表于 2012-11-9 15:49:50 | 显示全部楼层
这个宏定义返回一个bool值,就是check下你给的n是不是合法的参数。。。。允许的值就是0 1 2 3
因为可能传入的不是uint类型,也可能是int类型,所以。。。。
(290399531)

出0入0汤圆

 楼主| 发表于 2012-11-9 20:55:36 | 显示全部楼层
第一次碰到这样的宏定义,通过您的指教,基本明白了这个宏定义的含义,多谢!
如果n为uint型,那么改为这样是否功能不变呢?
#define PARAM_I2C_SLAVEADDR_CH (   n )     (n<=3))

(227166692)

出0入0汤圆

发表于 2014-11-11 17:36:15 | 显示全部楼层
问题已解决
(73574988)

出0入0汤圆

发表于 2019-9-24 09:57:59 | 显示全部楼层
jisaowang 发表于 2012-11-8 14:56
把中国人写的书扔掉是你进步的第一步。。。。

厉害 就服你
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-22 23:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表