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