【发布时间】:2009-09-01 13:13:35
【问题描述】:
我有一个小样本函数:
#define VALUE 0
int test(unsigned char x) {
if (x>=VALUE)
return 0;
else
return 1;
}
我的编译器警告我,比较 (x>=VALUE) 在所有情况下都是正确的,这是正确的,因为 x 是一个无符号字符并且 VALUE 定义为值 0。所以我将代码更改为:
if ( ((signed int) x ) >= ((signed int) VALUE ))
但是警告又来了。我用三个 GCC 版本(所有版本 > 4.0,有时您必须启用 -Wextra)对其进行了测试。
在改变的情况下,我有这个显式转换,它应该是一个有符号的 int 比较。为什么它声称比较总是正确的?
【问题讨论】:
-
那么,你想要完成什么?在什么情况下你希望它返回 1 而不是 0?
-
我的目的是避开这个警告。
-
不要逃避警告,试着摆脱你需要知道无符号是否 >= 0。它总是 - 这就是编译器告诉你的。
-
我希望有可能将VALUE的定义更改为0以外的其他值。如果VALUE不是0,没问题。
-
听起来是向我应用 YAGNI 的好时机。等到您真正需要该功能。或者,如果您确实需要它,它可能不应该是编译时间常数,而是配置参数或命令行参数或您拥有的任何东西。
标签: gcc casting literals gcc-warning