Мне посоветовали использовать следующие опции с 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;
Но это не решает общую проблему, когда мне приходится сравнивать значения со знаком со значениями без знака, используя эти параметры компилятора. Есть ли более чистый способ вместо кастинга?