web-dev-qa-db-ja.com

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

Cでsize_t型の変数を出力したいのですが、size_tは異なるアーキテクチャの異なる変数型にエイリアスされているようです。たとえば、あるマシン(64ビット)では、次のコードは警告をスローしません。

size_t size = 1;
printf("the size is %ld", size);

しかし、他のマシン(32ビット)では、上記のコードは次の警告メッセージを生成します。

警告:形式 '%ld'は型 'long int *'を想定していますが、引数3は型 'size_t *'を持っています

これはポインターサイズの違いによるものと思われるため、64ビットマシンではsize_tlong int"%ld")にエイリアスされますが、32ビットマシンではsize_tは別のタイプのエイリアスです。

size_t専用のフォーマット指定子はありますか?

74
Ethan Heilman

はい: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

使用可能なその他の長さ修飾子は、hhcharの場合)、hshortの場合)、llongの場合)、 lllong longの場合)、jintmax_tの場合)、tptrdiff_tの場合)、およびLlong doubleの場合)。 C99標準の§7.19.6.1(7)を参照してください。

108
Adam Rosenfield

はいあります。 %zu(ANSI C99で指定)。

size_t size = 1;
printf("the size is %zu", size);

ご了承ください size_tは符号なし、したがって%ldは二重に間違っています。間違った長さ修飾子と間違った形式変換指定子です。疑問に思う場合は、%zdssize_t(署名されています)。

39
maxschlepzig

[〜#〜] msdn [〜#〜] は、Visual Studioが32および64ビットプラットフォームで移植可能なコードの「I」プレフィックスをサポートすることを示します。

size_t size = 10;
printf("size is %Iu", size);
1
Arkantos