Je construis mon projet avec le drapeau d'avertissement -Wconversion de GCC. (gcc (Debian 4.3.2-1.1) 4.3.2) sur un système d'exploitation/matériel GNU/Linux 64 bits. Je trouve cela utile d'identifier où j'ai mélangé les types ou perdu la clarté quant aux types qui devraient être utilisés.Comment gérer les avertissements -Wconversion de GCC?
Ce n'est pas utile dans la plupart des autres situations qui activent c'est des avertissements et je demande comment suis-je censé faire face à ces:
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 */
En raison des résultats inattendus des essais ci-dessus (cas a
et c
) Je demande également que ces différences soient également expliquées.
Éditer: Et est-ce trop de génie pour lancer tous ces éléments avec (char)
pour empêcher l'avertissement?
Edit2: Certains cas supplémentaires (à la suite des cas ci-dessus):
a += A; /* warning converting from int to char */
a++; /* ok */
a += (char)1; /* warning converting from int to char */
En dehors de cela, ce que je demande est subjective et j'aimerais entendre comment les gens traitent les avertissements de conversion dans des cas comme ceux-ci lorsque vous considérez que certains développeurs préconisent de supprimer tous les avertissements.
YAE:
Une solution possible est d'utiliser simplement int
s au lieu de char
s droit? En fait, non seulement cela nécessite plus de mémoire, mais c'est aussi plus lent, comme le démontre le code suivant. Les expressions mathématiques sont juste là pour obtenir les avertissements lorsqu'il est construit avec -Wconversion
. Je suppose que la version utilisant char
variables serait plus lente que celle en utilisant int
s en raison des conversions, mais sur mon (64bit dual core II) système la version int
est plus lente.
#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;
}
passe -DUSE_INT
à gcc pour construire la version int de l'extrait ci-dessus.
Que dit-il lorsque vous compilez avec A> 255? –
avec 'A = 256'" avertissement: débordement dans la conversion constante implicite "pour' char a = A' et "avertissement: la conversion en 'char' modifie 'int' valeur constante" pour 'char c = B - 2' –