web-dev-qa-db-ja.com

off_tやsize_tなどのタイプを印刷するにはどうすればよいですか?

off_tsize_tなどのタイプを印刷しようとしています。 printf()つまり移植可能の正しいプレースホルダーは何ですか?

それとも、これらの変数を印刷するためのまったく異なる方法がありますか?

141
Georg Schölly

Size_tにはzを使用し、ptrdiff_tにはtを使用できます

printf("%zu %td", size, ptrdiff);

しかし、私のマンページでは、いくつかの古いライブラリはzとは異なる文字を使用しており、その使用を推奨していません。それにもかかわらず、標準化されています(C99標準によって)。 intmax_tおよびint8_tstdint.hなどには、使用できるマクロがあります。別の答えは次のとおりです。

printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);

それらはinttypes.hのマンページにリストされています。

個人的には、別の答えが推奨するように、値をunsigned longまたはlongにキャストするだけです。 C99を使用している場合は、unsigned long longまたはlong longにキャストし、もちろん%lluまたは%lld形式を使用できます(もちろん、そうすべきです)。

104

off_tを印刷するには:

printf("%jd\n", (intmax_t)x);

size_tを印刷するには:

printf("%zu\n", x);

ssize_tを印刷するには:

printf("%zd\n", x);

C99標準の7.19.6.1/7、またはフォーマットコードのより便利なPOSIXドキュメントを参照してください。

http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html

実装がこれらのフォーマットコードをサポートしていない場合(たとえば、C89を使用しているため)、C89にはフォーマットコードがあり、同じサイズであることが保証されている整数型がないため、少し問題があります。これらのタイプとして。そのため、実装固有の何かを行う必要があります。

たとえば、コンパイラにlong longがあり、標準ライブラリが%lldをサポートしている場合、intmax_tの代わりに確実に機能することが期待できます。しかし、そうでない場合は、longにフォールバックする必要があります。これは、小さすぎるため、他の実装では失敗します。

102
Steve Jessop

Microsoftの場合、答えは異なります。 VS2013は主にC99に準拠していますが、「[t] he hh、j、z、およびtの長さのプレフィックスはサポートされていません。」 size_tについては、つまり、32ビットプラットフォームでは符号なし__int32、64ビットプラットフォームでは符号なし__int64で、接頭辞I(大文字の目)を型指定子o、u、x、またはXとともに使用します。 VS2013サイズ仕様を参照

Off_tに関しては、VC\include\sys\types.hでlongとして定義されています。

5
NoBrassRing

Inttypes.hのフォーマットマクロを使用する必要があります。

この質問を参照してください: size_t型の変数のクロスプラットフォームフォーマット文字列

3
Michael Burr

どのバージョンのCを使用していますか?

C90では、標準的な慣行では、必要に応じて符号付きまたは符号なしのlongにキャストし、それに応じて印刷します。 size_tの%zを確認しましたが、HarbisonとSteeleはprintf()の下でそれを言及していません。いずれにしても、ptrdiff_tなどでは役に立たないでしょう。

C99では、さまざまな_t型に独自のprintfマクロが付属しているため、"Size is " FOO " bytes."のような詳細はわかりませんが、これはかなり大きな数値形式インクルードファイルの一部です。

3
David Thornley

Linux、OS X、およびOpenBSDでman 3 printfを見ると、%zsize_t%tptrdiff_t(C99の)のサポートがすべて表示されますが、それらはoff_tに言及しています。野生の提案は通常、%uoff_t変換を提供します。これは、私が知る限り「十分に正しい」(unsigned intoff_tは64 -ビットおよび32ビットシステム)。

1
dwc