【发布时间】:2009-10-29 12:58:21
【问题描述】:
我正在使用 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 */
除此之外,我的问题是主观的,当您认为某些开发人员主张删除所有警告时,我想听听其他人如何处理此类情况下的转换警告.
YAE:
一种可能的解决方案是只使用ints 而不是chars,对吗?实际上,它不仅需要更多内存,而且速度也较慢,如以下代码所示。使用-Wconversion 构建时,数学表达式只是为了获得警告。由于转换,我假设使用 char 变量的版本会比使用 ints 的版本运行得慢,但在我的(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;
}
将-DUSE_INT 传递给gcc 以构建上述sn-p 的int 版本。
【问题讨论】:
-
用 A > 255 编译时是什么意思?
-
对于
A = 256,char a = A带有“警告:隐式常量转换中溢出”,char c = B - 2带有“警告:转换为‘char’会改变‘int’常量值”
标签: c gcc compiler-warnings