Avertissement du compilateur à propos de printf() de long unsigned int et uint32_t
Dans mon code en C, je suis fprintf
ing un "%lu"
et de donner une uint32_t
pour le champ correspondant. Mais, quand je compile avec -Wall
de GCC (ver. 4.2.4), j'obtiens le message d'avertissement suivant:
writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type
`uint32_t'
Ne sont pas un uint32_t
et long unsigned int
la même chose sur les architectures 32 bits? Peut cet avertissement être évitée sans éliminer la -Wall
commutateur de compilateur ou à l'aide d'un transtypage (et si oui, comment)?
Oui, je suis toujours à l'aide d'un ordinateur 32 bits/arch/OS/compilateur (trop pauvre pour le moment de s'offrir de nouveaux 64 bits HW). Merci!
Vraie question: "Comment puis-je obtenir gcc pas avertir sur {%d avec de longs}, sur les machines où long == int, parce que, pour une raison quelconque (probablement MS compat) le int32_t a été défini comme le long au lieu de int sur la machine, et les gens insistent sur l'utilisation de int32_t partout, et je ne veux vraiment pas mettre (int) devant chaque chose, passé à printf".
OriginalL'auteur pr1268 | 2011-02-10
Vous devez vous connecter pour publier un commentaire.
uint32_t
sur x86 Linux avec GCC est justeunsigned int
. Donc, utiliserfprintf(stream, "%4u", ...)
(unsigned int) ou, mieux encore,fprintf(stream, "%4" PRIu32, ...)
(leinttypes.h
printf chaîne rédacteur de devis pouruint32_t
).Ce dernier va certainement éliminer le compilateur d'avertissement /d'erreur, et, en outre, est multi-plateforme.
PRIu32
est le définir qui gèreuint32_t
correctement.Oh mon dieu, vous avez raison! Je me suis trompé. Merci. Je vais supprimer mon commentaire.
OriginalL'auteur Conrad Meyer
Le moyen le plus fiable de supprimer l'avertissement est avec un cast:
unsigned long
est exactement suffisante pour contenir toutes les valeurs de typeuint32_t
.OriginalL'auteur William Pursell
"long int" et "int" sont de types différents, en C++. Vous pourriez être à la recherche pour le "u" format", qui signifie "unsigned int". Bien sûr, cela dépend de ce que "uint32_t" est un typedef pour votre compilateur.
OriginalL'auteur gparent