off_t や size_t などの型を出力するにはどうすればよいですか?

z を使用できます size_t と t の場合 のような ptrdiff_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 に準拠していますが、「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 と定義されています。