Je souhaite imprimer une variable de type size_t
en C, mais il semble que size_t
soit size_t
à différents types de variables sur différentes architectures. Par exemple, sur une machine (64 bits), le code suivant ne lance aucun avertissement:
size_t size = 1; printf("the size is %ld", size);
mais sur mon autre ordinateur (32 bits), le code ci-dessus génère le message d’avertissement suivant:
avertissement: format ‘% ld’ attend le type ‘long int *’, mais l’argument 3 a le type ‘size_t *’
J’imagine que cela est dû à la différence de taille du pointeur, de sorte que ma machine de size_t
est size_t
par un size_t
long int
( "%ld"
), alors que sur ma machine 32 bits, size_t
correspond à un autre type.
Existe-t-il un spécificateur de format spécifique à size_t
?
Oui: utilisez le modificateur de longueur z
:
size_t size = sizeof(char); printf("the size is %zd\n", size); // decimal size_t printf("the size is %zx\n", size); // hex size_t
Les autres modificateurs de longueur disponibles sont hh
(pour char
), h
(en short
), l
(pour long
), ll
(pour long long
), j
(pour intmax_t
), t
(pour ptrdiff_t
) et L
(pour long double
). Voir le paragraphe 7.19.6.1 (7) de la norme C99.
Oui il y a. C’est %zu
(comme spécifié dans ANSI C99).
size_t size = 1; printf("the size is %zu", size);
Notez que size_t
n’est pas signé, donc %ld
est double faux: mauvais modificateur de longueur et mauvais spécificateur de conversion de format. Au cas où vous vous %zd
question, %zd
est pour ssize_t
(qui est signé).
MSDN dit que Visual Studio prend en charge le préfixe “I” pour le code portable sur les plates-formes 32 et 64 bits.
size_t size = 10; printf("size is %Iu", size);