我正在使用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)
转换以防止警告,这是否过度设计?编辑2:一些额外情况(接着上述情况):
a += A; /* warning converting from int to char */
a++; /* ok */
a += (char)1; /* warning converting from int to char */
除此之外,我要问的是主观的,并且我想听听其他人在类似情况下如何处理转换警告,考虑到一些开发人员主张删除所有警告。
YAE:
一个可能的解决方案是只使用
int
而不是char
,对吧?实际上,它不仅需要更多的内存,而且速度也更慢,正如以下代码所示。数学表达式只是为了在使用-Wconversion
编译时获得警告。我假设使用char
变量的版本会比使用int
变量的版本运行得更慢,因为需要进行转换,但在我的(64位双核II)系统上,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;
}
向gcc传递-DUSE_INT
参数,以构建上述代码段的整数版本。
A = 256
,对于char a = A
,会显示警告信息:“warning: overflow in implicit constant conversion”;对于char c = B - 2
,会显示警告信息:“warning: conversion to ‘char’ alters ‘int’ constant value”。 - James Morris