我正在使用 GCC 的 -Wconversion 警告标志构建我的项目。(gcc (Debian 4.3.2-1.1) 4.3.2) 在 64 位 GNU/Linux 操作系统/硬件上。我发现它有助于确定我在哪里混合了类型或不清楚应该使用哪些类型。
在激活它的警告的大多数其他情况下,它并没有太大帮助,我在问我打算如何处理这些:
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 */
除此之外,我要问的是主观的,当您认为某些开发人员主张删除所有警告时,我想听听其他人在此类情况下如何处理转换警告。
耶:
一种可能的解决方案是只使用int
s 而不是char
s 对吗?实际上,它不仅需要更多内存,而且速度也较慢,如以下代码所示。数学表达式只是为了在使用-Wconversion
. 由于转换,我假设使用char
变量的版本会比使用 s 的版本运行得慢,但在我的(64 位双核 II)系统上,版本更慢。int
int
#include <stdio.h>
#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 版本。