Je veux imprimer une variable de type size_t
en C mais il semble qu'elle size_t
soit aliasée avec différents types de variables sur différentes architectures. Par exemple, sur une machine (64 bits), le code suivant ne renvoie aucun avertissement:
size_t size = 1;
printf("the size is %ld", size);
mais sur mon autre ordinateur (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 aliasé sur un long int
( "%ld"
), alors que sur ma machine 32 bits size_t
est aliasé sur un autre type.
Existe-t-il un spécificateur de format spécifiquement pour size_t
?
c
platform-independent
size-t
format-string
format-specifiers
Ethan Heilman
la source
la source
&
part?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
quand cela devrait probablement être le caswarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Utilisiez-vous peut-être à lascanf()
place lorsque vous avez reçu ces avertissements?Réponses:
Oui: utilisez le
z
modificateur de longueur: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
(pourchar
),h
(pourshort
),l
(pourlong
),ll
(pourlong long
),j
(pourintmax_t
),t
(pourptrdiff_t
) etL
(pourlong double
). Voir §7.19.6.1 (7) de la norme C99.la source
size_t
et anssize_t
; ce dernier est rarement utilisé.%zu
, car l'argument n'est pas signé.z
modificateur de longueur ne fait pas partie de C89 / C90. Si vous visez un code compatible C89, le mieux que vous puissiez faire est de convertirunsigned long
et d'utiliser lel
modificateur de longueur à la place, par exempleprintf("the size is %lu\n", (unsigned long)size);
; la prise en charge à la fois de C89 et de systèmes avec unesize_t
taille supérieurelong
est plus délicate et nécessiterait l'utilisation d'un certain nombre de macros de préprocesseur.Oui il y a. Il est
%zu
(comme spécifié dans ANSI C99).size_t size = 1; printf("the size is %zu", size);
Notez que ce
size_t
n'est pas signé, donc%ld
double faux: mauvais modificateur de longueur et mauvais spécificateur de conversion de format. Au cas où vous vous poseriez la question,%zd
c'est pourssize_t
(qui est signé).la source
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);
la source