Je souhaite imprimer une variable de type size_t
en C mais il semble que size_t
est lié à 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 machine (32 bits), le code ci-dessus produit le message d'avertissement suivant:
avertissement: le format '% ld' attend le type 'long int *', mais l'argument 3 a le type 'size_t *'
Je soupçonne que cela est dû à la différence de taille du pointeur, de sorte que sur ma machine 64 bits size_t
est associé à un long int
("%ld"
), alors que sur ma machine 32 bits size_t
est lié à un autre type.
Existe-t-il un spécificateur de format spécifiquement pour size_t
?
Oui: utilisez le modificateur de longueur z
:
size_t size = sizeof(char);
printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size); // hex size_t
Les autres modificateurs de longueur disponibles sont hh
(pour char
), h
(pour short
), l
(pour long
), ll
(pour long long
), j
(pour intmax_t
), t
(pour ptrdiff_t
) et L
(pour long double
). Voir §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. Si vous vous demandez, %zd
est pour ssize_t
(qui est signé).
MSDN , indique 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);