off_t
やsize_t
などのタイプを印刷しようとしています。 printf()
つまり移植可能の正しいプレースホルダーは何ですか?
それとも、これらの変数を印刷するためのまったく異なる方法がありますか?
Size_tにはz
を使用し、ptrdiff_tにはt
を使用できます
printf("%zu %td", size, ptrdiff);
しかし、私のマンページでは、いくつかの古いライブラリはz
とは異なる文字を使用しており、その使用を推奨していません。それにもかかわらず、標準化されています(C99標準によって)。 intmax_t
およびint8_t
のstdint.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
形式を使用できます(もちろん、そうすべきです)。
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
にフォールバックする必要があります。これは、小さすぎるため、他の実装では失敗します。
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として定義されています。
Inttypes.hのフォーマットマクロを使用する必要があります。
この質問を参照してください: size_t型の変数のクロスプラットフォームフォーマット文字列
どのバージョンのCを使用していますか?
C90では、標準的な慣行では、必要に応じて符号付きまたは符号なしのlongにキャストし、それに応じて印刷します。 size_tの%zを確認しましたが、HarbisonとSteeleはprintf()の下でそれを言及していません。いずれにしても、ptrdiff_tなどでは役に立たないでしょう。
C99では、さまざまな_t型に独自のprintfマクロが付属しているため、"Size is " FOO " bytes."
のような詳細はわかりませんが、これはかなり大きな数値形式インクルードファイルの一部です。
Linux、OS X、およびOpenBSDでman 3 printf
を見ると、%z
のsize_t
と%t
のptrdiff_t
(C99の)のサポートがすべて表示されますが、それらはoff_t
に言及しています。野生の提案は通常、%u
のoff_t
変換を提供します。これは、私が知る限り「十分に正しい」(unsigned int
とoff_t
は64 -ビットおよび32ビットシステム)。