我正在用GCC的-Wconversion警告标志构建我的项目.(gcc(Debian 4.3.2-1.1)4.3.2)在64位GNU/Linux OS /硬件上.我发现它有助于确定我混合类型的位置或者应该使用哪种类型的清晰度.
在大多数激活它的警告的其他情况下它并没有那么有用,我问我打算如何处理这些问题:
enum { A = 45, B, C }; /* fine */ char a = A; /* huh? seems to not warn about A being int. */ char b = a + 1; /* warning converting from int to char */ char c = B - 2; /* huh? ignores this *blatant* int too.*/ char d = (a > b ? b : c) /* warning converting from int to char */
由于上述测试(案例a
和c
)的意外结果,我也要求解释这些差异.
编辑:(char)
为了防止警告,是否过度工程化所有这些?
Edit2:一些额外案例(继上述案例之后):
a += A; /* warning converting from int to char */ a++; /* ok */ a += (char)1; /* warning converting from int to char */
除此之外,我所要求的是主观的,我想听听其他人在你认为某些开发人员主张删除所有警告时如何处理转换警告.
YAE:
一种可能的解决方案是使用int
s而不是char
s?实际上,它不仅需要更多内存,而且速度也更慢,如下面的代码所示.数学表达式只是用于构建时获取警告-Wconversion
.我认为使用char
变量的版本比使用int
s 的版本运行速度慢,但是在我的(64位双核II)系统上,int
版本速度较慢.
#include#ifdef USE_INT typedef int var; #else typedef char var; #endif int main() { var start = 10; var end = 100; var n = 5; int b = 100000000; while (b > 0) { n = (start - 5) + (n - (n % 3 ? 1 : 3)); if (n >= end) { n -= (end + 7); n += start + 2; } b--; } return 0; }
传递-DUSE_INT
给gcc来构建上述代码片段的int版本.