98

size_tCで型の変数を出力したいのですが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か?

4

3 に答える 3

133

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

使用可能な他の長さ修飾子は、(for hh) 、(for ) 、 ( for )、(for )、(for )、(for )、および(for ) です。C99 標準の §7.19.6.1 (7) を参照してください。charhshortllonglllong longjintmax_ttptrdiff_tLlong double

于 2010-01-24T03:49:24.153 に答える
48

はいあります。それは%zu(ANSI C99 で指定されているように) です。

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

size_t符号なしであるため、二重に間違っていることに注意してください%ld。間違った長さ修飾子と間違ったフォーマット変換指定子です。ご参考までに、%zdssize_t(署名されている)用です。

于 2014-03-01T13:24:06.047 に答える
1

MSDNは、Visual Studio が 32 ビットおよび 64 ビット プラットフォームで移植可能なコードの "I" プレフィックスをサポートしていると述べています。

size_t size = 10;
printf("size is %Iu", size);
于 2015-10-14T19:03:33.927 に答える