454 votes

Comment imprimer size_t variable portable ?

J'ai une variable de type size_t, et je veux l'imprimer à l'aide de printf(). Ce spécificateur de format dois-je utiliser pour imprimer de façon portable?

Dans la machine 32 bits, %u me semble bon. J'ai compilé avec g++ -g -W -Wall-Werror -ansi -pedantic, et il n'y avait pas d'avertissement. Mais quand je compile ce code dans machine 64 bits, il produit l'avertissement.

size_t x = <something>;
printf( "size = %u\n", x );

warning: format '%u' expects type 'unsigned int', 
    but argument 2 has type 'long unsigned int'

L'avertissement s'en va, comme prévu, si je change que d' %lu.

La question est, comment puis-je écrire le code, afin qu'il compile alerte gratuite sur les versions 32 et 64 bits machines?

Edit: je suppose que la réponse pourrait être "jeté" de la variable en unsigned long, et les imprimer à l'aide d' %lu. Qui serait à l'œuvre dans les deux cas. Je suis à la recherche si il y a une autre idée.

542voto

Adam Rosenfield Points 176408

Utilisation du `` modificateur :

96voto

T.J. Crowder Points 285826

Ressemble, il varie en fonction de ce compilateur que vous utilisez (blech):

...et bien sûr, si vous êtes à l'aide de C++, vous pouvez utiliser cout au lieu de cela, comme suggéré par d'AraK.

64voto

John Bode Points 33046

Pour C89 : Utiliser et coulés à :

Pour C99, utiliser `` :

6voto

swestrup Points 2120

Pour ceux qui parle de cela en C++ qui ne supporte pas nécessairement les extensions C99, alors je recommande vivement boost::format. Cela rend la question de taille de type size_t théorique :

Puisque vous n’avez pas besoin des spécificateurs de taille en boost::format, vous pouvez inquiéter juste comment vous voulez afficher la valeur.

5voto

AraK Points 38702
std::size_t s = 1024;
std::cout << s; // or any other kind of stream like stringstream!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X