Je souhaite imprimer la valeur d'un size_t
variable utilisant printf
en C++ avec Microsoft Visual Studio 2010 (je veux utiliser printf
au lieu de <<
dans ce morceau de code spécifique, donc s'il vous plaît pas de réponses me disant que je devrais utiliser <<
au lieu).
Selon le post
spécificateurs de format size_t indépendants de la plateforme en c?
la bonne façon indépendante de la plate-forme consiste à utiliser %zu
, mais cela ne semble pas fonctionner dans Visual Studio. La documentation de Visual Studio sur
http://msdn.Microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx
me dit que je dois utiliser %Iu
(en utilisant les majuscules i
, et non les minuscules l
).
Microsoft ne suit-il pas les normes ici? Ou la norme a-t-elle été modifiée depuis C99? Ou la norme est-elle différente entre C et C++ (ce qui me semblerait très étrange)?
MS Visual Studio ne prend pas en charge %zu
spécificateur printf avant VS2013
. À partir de VS2013 (par exemple _MSC_VER
> = 1800
) %zu
est disponible .
Comme alternative, pour les versions précédentes de Visual Studio, si vous imprimez de petites valeurs (comme le nombre d'éléments à partir de conteneurs std), vous pouvez simplement transtyper en int
et utiliser %d
:
printf("count: %d\n", (int)str.size()); // less digital ink spent
// or:
printf("count: %u\n", (unsigned)str.size());
La documentation Microsoft déclare:
Les préfixes de longueur
hh
,j
,z
ett
ne sont pas pris en charge.
Et donc %zu
n'est pas pris en charge.
Il indique également que le préfixe correct à utiliser pour size_t
est I
- vous utiliserez donc %Iu
.
Le compilateur C de Microsoft ne rattrape pas les dernières normes C. Il s'agit essentiellement d'un compilateur C89 avec des fonctionnalités choisies par les cerises de C99 (par exemple long long
). Il n'est donc pas surprenant que quelque chose ne soit pas pris en charge (%zu
est apparu en C99).
Basé sur la réponse de ici , %z
est un ajout C99. Étant donné que MSVC ne prend en charge aucune des normes C ultérieures, il n'est pas surprenant que %z
n'est pas pris en charge.