web-dev-qa-db-fra.com

Spécificateur de format d'impression correct pour size_t:% zu ou% Iu?

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)?

41
Patrick

MS Visual Studio ne prend pas en charge %zu spécificateur printf avant VS2013. À partir de VS2013 (par exemple _MSC_VER> = 1800) %zuest 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());
11
Pavel

La documentation Microsoft déclare:

Les préfixes de longueur hh, j, z et t 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.

18
Orion Edwards

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).

15
Alexey Frunze

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.

6
Yuushi