いつ、どのようにプリント種類のようにoff_t、size_t?
-
06-09-2019 - |
質問
監督-選手コメン印刷のような種類 off_t
や size_t
.何が正しいプレースホルダーのための printf()
このポータブル?
それには、まったく別の方法で印刷その変数には?
解決
は、
のようにptrdiff_tのためsize_t型とz
ためt
を使用することができます
printf("%zu %td", size, ptrdiff);
しかし、私のmanページには、いくつかの古いライブラリはz
とは異なる文字を使用し、それを使用することを推奨してい言います。それにもかかわらず、それは(C99標準で)標準化されたのです。別の答えが言ったようなので、上のものintmax_t
とint8_t
のstdint.h
とするために、使用できるマクロは、存在します:
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
これらはinttypes.h
のmanページに記載されています。
個人的に、私は別の答えが推奨するよう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標準、またはフォーマットコードのより便利なPOSIXのドキュメントの7.19.6.1/7を参照してください。
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 "それは、符号なし__int32 32-bitプラットフォームに、unsigned__int64 64-bitプラットフォームを使用"の接頭辞(資本)タイプ指定子o、u、x、X 見VS2013サイズ仕様
てoff_tに定義されてVCがsys\。hです。
あなたはCのどのバージョンを使用していますか?
C90では、標準的な慣行は、それに応じて適切な、印刷として、符号付きまたは符号なしlongにキャストすることです。私はsize_tのための%Zを見てきましたが、ハービソン及びスティールのprintf()の下でそれを言及していない、そしてどのような場合にはptrdiff_tのか、何のお手伝いをしていないだろうと。
C99では、ファイルを含める"Size is " FOO " bytes."
のようなものは、私は詳細を知らないので、様々なタイプの_tは、自分自身のprintfのマクロが付属していますが、それはかなり大きな数値形式の一部です。
あなたはinttypes.hから書式設定のマクロを使用するとよいでしょう。
の変数のためのクロスプラットフォームのフォーマット文字列:この質問を参照してくださいタイプsize_tの?
の Linuxでは、OS X、およびOpenBSDのman 3 printf
ため%z
とsize_t
ため%t
のためのすべてのショーのサポート(C99用)、上ptrdiff_t
ますが、それらの言及のoff_t
のどれを見てみます。野生での提案は、通常、私の知る限り(%u
とoff_t
両方が64ビットと32ビットのシステム間で同一の変化)「十分に正確」である、unsigned int
用off_t
変換を提供しています。
またこの後少なくとも、での受け答えが難しい記憶んで使わないもん z
または j
国旗とかいないと思い platform大聖堂と象の噴水).
の 標準 言うことはありません明確にし、正確なデータの長さ size_t
, であることをまずチェックの長さ size_t
お使いのプラットフォームを選択して:
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
とあることを stdint
種類の代わりに原データの種類consistancy.
私が思い出すと、それを行うための唯一の移植方法、「符号なしlong int型」に結果をキャストし、%lu
を使用することです。
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
off_t型のための "%ZO" を使用。 (8進数) 小数または "%のZU" ます。