web-dev-qa-db-ja.com

size_tのprintf形式指定子を修正:%zuまたは%Iu?

Microsoft Visual Studio 2010を使用してC++でprintfを使用してsize_t変数の値を出力したい(この特定の<<の代わりにprintfを使用したいコードの一部ですので、代わりに<<を使用する必要があることを教えてください。

投稿によると

cでのプラットフォームに依存しないsize_t形式指定子

プラットフォームに依存しない正しい方法は%zuを使用することですが、これはVisual Studioでは機能しないようです。 Visual Studioのドキュメント

http://msdn.Microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx

%Iu(小文字のiではなく大文字のlを使用)を使用する必要があることを教えてくれます。

Microsoftはここの標準に従っていませんか?または、C99以降に規格が変更されましたか?または、CとC++で標準が異なりますか(これは非常に奇妙に思えます)。

41
Patrick

MS Visual Studioは、%zu以前のVS2013 printf指定子をサポートしていませんでした。 VS2013以降(例:_MSC_VER> = 1800%zu利用可能

別の方法として、Visual Studioの以前のバージョンでは、小さな値(stdコンテナーからの要素数など)を印刷する場合、単にintにキャストして%dを使用できます。

printf("count: %d\n", (int)str.size()); // less digital ink spent
// or:
printf("count: %u\n", (unsigned)str.size());
11
Pavel

Microsoftのドキュメント 状態:

hhjz、およびtの長さのプレフィックスはサポートされていません。

したがって、%zuはサポートされていません。

また、size_tに使用する正しいプレフィックスはIであるため、%Iuを使用します。

18
Orion Edwards

MicrosoftのCコンパイラは、最新のC標準に追いつきません。基本的には、C99の一部の厳選された機能を備えたC89コンパイラです(例:long long)。そのため、何かがサポートされていないことに驚きはないはずです(%zuはC99に登場しました)。

15
Alexey Frunze

here%zはC99の追加です。 MSVCは後のC標準をサポートしていないため、%zはサポートされていません。

6
Yuushi