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_t
はlong int
("%ld"
)にエイリアスされますが、32ビットマシンではsize_t
は別のタイプのエイリアスです。
size_t
専用のフォーマット指定子はありますか?
はい: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
使用可能なその他の長さ修飾子は、hh
(char
の場合)、h
(short
の場合)、l
(long
の場合)、 ll
(long long
の場合)、j
(intmax_t
の場合)、t
(ptrdiff_t
の場合)、およびL
(long double
の場合)。 C99標準の§7.19.6.1(7)を参照してください。
はいあります。 %zu
(ANSI C99で指定)。
size_t size = 1;
printf("the size is %zu", size);
ご了承ください size_t
は符号なし、したがって%ld
は二重に間違っています。間違った長さ修飾子と間違った形式変換指定子です。疑問に思う場合は、%zd
はssize_t
(署名されています)。
[〜#〜] msdn [〜#〜] は、Visual Studioが32および64ビットプラットフォームで移植可能なコードの「I」プレフィックスをサポートすることを示します。
size_t size = 10;
printf("size is %Iu", size);