Plate-forme indépendante spécificateurs size_t Format en c?
-
22-09-2019 - |
Question
Je veux imprimer une variable de type size_t
en C, mais il semble que size_t
est aliasé à différents types de variables sur différentes architectures. Par exemple, sur une machine (64 bits) le code suivant ne jette pas d'avertissement:
size_t size = 1;
printf("the size is %ld", size);
mais mon autre machine (32 bits), le code ci-dessus produit le message d'avertissement suivant:
avertissement: format '% ld' attend de type 'Long int *', mais l'argument est de type 3 'Size_t *'
Je soupçonne que cela est dû à la différence de taille du pointeur, de sorte que sur mon size_t
machine 64 bits est associé à un nom long int
("%ld"
), alors que sur ma machine 32 bits size_t
est aliasé à un autre type.
Y at-il un spécificateur de format spécifique pour size_t
?
La solution
Oui: utiliser le modificateur de longueur de 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 qui sont 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.
Autres conseils
Oui, il y a. Il est %zu
(comme spécifié dans la norme ANSI C99).
size_t size = 1;
printf("the size is %zu", size);
Notez que size_t
est non signée, ainsi %ld
est le double mal: mauvais modificateur de longueur et spécificateur de conversion de format incorrect. Dans le cas où vous vous demandez, %zd
est pour ssize_t
(qui est signé).
MSDN , dit que Visual Studio prend en charge le préfixe "I" pour portable de code sur les plates-formes 32 et 64 bits.
size_t size = 10;
printf("size is %Iu", size);