Come posso correggere avvisi come: “confronto tra firmato e non firmato”?

Mi è stato consigliato di utilizzare le seguenti opzioni con GCC, in quanto aiuta a evitare molti errori comuni. -Werror un sacco di avvertimenti e -Werror li trasforma in errori.

 gcc -pedantic -W -Wall -Wextra -Wshadow -Wstrict-overflow=5 -Wwrite-strings -std=c99 -Werror 

Dato il seguente codice di prova:

 #include  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; } 

Ho capito:

 test.c:11: error: comparison between signed and unsigned 

So che un modo per risolvere questo problema è di distriggersre gli avvisi, ma non mi hanno fatto usare queste impostazioni per distriggersrle alla fine.

Un altro modo è quello di lanciare il materiale, ma mi è stato detto che il casting è deprecato.

Inoltre, potrei fare x in un unsigned int :

 unsigned x; 

Ma non risolve il problema generale quando devo confrontare i valori firmati con i valori non firmati usando queste opzioni del compilatore. C’è un modo più pulito invece di lanciare?