off_t
や などのタイプを印刷しようとしていますsize_t
。printf()
ポータブルの正しいプレースホルダーは何ですか?
または、これらの変数を出力するまったく別の方法はありますか?
off_t
や などのタイプを印刷しようとしていますsize_t
。printf()
ポータブルの正しいプレースホルダーは何ですか?
または、これらの変数を出力するまったく別の方法はありますか?
z
size_tとt
ptrdiff_tには次のように使用できます
printf("%zu %td", size, ptrdiff);
しかし、私のマンページには、古いライブラリの中には、それとは異なる文字z
を使用していて、その使用を思いとどまらせるものがあると書かれています。それにもかかわらず、それは標準化されています(C99標準によって)。それらintmax_t
やint8_t
ofstdint.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を使用しているため)、AFAIKにはフォーマットコードを持ち、同じくらい大きいことが保証されている整数型がないため、少し問題があります。これらのタイプとして。したがって、実装固有の何かを行う必要があります。
たとえば、コンパイラがlong long
を持っていて、標準ライブラリがをサポートしている%lld
場合、それがの代わりに機能することを自信を持って期待できますintmax_t
。ただし、そうでない場合は、にフォールバックする必要があります。long
これは、小さすぎるため、他のいくつかの実装では失敗します。
Microsoft の場合、答えは異なります。VS2013 は大部分が C99 に準拠していますが、「hh、j、z、および t の長さのプレフィックスはサポートされていません」。size_t の場合、「つまり、32 ビット プラットフォームでは unsigned __int32、64 ビット プラットフォームでは unsigned __int64」は、型指定子 o、u、x、または X でプレフィックス I (大文字の目) を使用します 。VS2013 のサイズ仕様を参照してください。
off_t については、VC\include\sys\types.h で long と定義されています。
inttypes.hのフォーマットマクロを使用することをお勧めします。
この質問を参照してください: size_t型の変数のクロスプラットフォームフォーマット文字列?
man 3 printf
Linux、OS X、およびOpenBSDを見ると、すべて(C99の場合)のサポートが示されていますが、それらのいずれも言及されていませ%z
ん。世の中の提案は通常、の変換を提供します。これは、私が知る限り「十分に正しい」です(64ビットシステムと32ビットシステムの両方で同じように異なります)。size_t
%t
ptrdiff_t
off_t
%u
off_t
unsigned int
off_t
受け入れられた答えを思い出すのが難しいため、この投稿を少なくとも2回見ました(z
またはj
フラグを使用することはめったになく、プラットフォームに依存していないようです)。
標準ではの正確なデータ長が明確に規定されていないため、まずプラットフォームsize_t
で長さを確認してから、そのうちの 1 つを選択することをお勧めします。size_t
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
stdint
また、一貫性を保つために生データ型ではなく型を使用することをお勧めします。
off_t には「%zo」を使用します。(8 進数) または 10 進数の場合は "%zu"。