【发布时间】:2009-05-13 19:31:05
【问题描述】:
有人建议我对 GCC 使用以下选项,因为它有助于避免许多常见错误。它会打开一堆警告,-Werror 会将它们变成错误。
gcc -pedantic -W -Wall -Wextra -Wshadow -Wstrict-overflow=5 -Wwrite-strings -std=c99 -Werror
给定以下测试代码:
#include <stdio.h>
int main(void)
{
int arr[8]={0,10,20,30,40,50,60,70};
int x;
printf("sizeof(arr): %d\n", sizeof(arr));
printf("sizeof(int): %d\n", sizeof(int));
for(x = 0; x < sizeof(arr)/sizeof(int); x++)
{
printf("%d\n",arr[x]);
}
return 0;
}
我明白了:
test.c:11: error: comparison between signed and unsigned
我知道解决此问题的一种方法是关闭警告,但它们并没有让我最终使用这些设置将其关闭。
另一种方法是强制转换,但有人告诉我不推荐使用强制转换。
另外,我可以将 x 变成 unsigned int:
unsigned x;
但是当我必须使用这些编译器选项将有符号值与无符号值进行比较时,它并不能解决一般问题。有没有比强制转换更清洁的方法?
【问题讨论】:
-
注意
sizeof返回一个size_t,必须使用%zu打印出来
标签: c