質問

私は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のために特別にありますか?

役に立ちましたか?

解決

はい: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用)、(h用)short、(l用)long、(ll用)long long、(j用)intmax_t、(t用)ptrdiff_t、及びL(ありますlong doubleのため)。 C99標準の§7.19.6.1(7)を参照してください。

他のヒント

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

size_t size = 1;
printf("the size is %zu", size);
size_tが符号なしであることを

注、従って%ld二重間違っている:間違った長さ修飾子と間違ったフォーマット変換指定子。あなたが疑問に思う場合は、%zdが(署名されている)ssize_tためです。

MSDN に、Visual Studioは "I" 接頭辞をサポートしていることを言います32ビットおよび64ビット・プラットフォーム上の移植可能なコードのために。

size_t size = 10;
printf("size is %Iu", size);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top