off_t
とsize_t
のようなタイプを印刷しようとしています。ポータブルのprintf()
の正しいプレースホルダは何ですか?off_tやsize_tのようなタイプはどうすれば印刷できますか?
これらの変数を印刷する方法はまったく異なりますか?
off_t
とsize_t
のようなタイプを印刷しようとしています。ポータブルのprintf()
の正しいプレースホルダは何ですか?off_tやsize_tのようなタイプはどうすれば印刷できますか?
これらの変数を印刷する方法はまったく異なりますか?
あなたは
printf("%zu %zd", size, ptrdiff);
のようptrdiff_tのためsize_t型とt
ためz
を使用することができます。しかし、私のマンページでは、一部の古いライブラリはz
とは異なる文字を使用し、それを使用することを推奨してい言います。それにもかかわらず、標準化されています(C99規格)。彼らはinttypes.h
のmanページに記載されてい
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
:別の答えが言ったように、これらのintmax_t
とstdint.h
のint8_t
などについて、使用できるマクロが、あります。
個人的には、別の回答が推奨するように値をunsigned long
またはlong
にキャストします。 C99を使用している場合は、unsigned long long
またはlong long
にキャストして(もちろん、もちろん)%llu
または%lld
の形式を使用できます。
PRId32には%format指定子が含まれていないので、 'printf(" value:% "PRId32、some_int32_t);' –
off_tは実際に私のシステム上では長い符号長です。 –
ええええええええええええええええええんを切たいあなたの長さをlongまたはlongに変換する必要があります。この後者の型は現在のC++には存在しませんが、次のバージョンにも含まれています。特にposixで作業していて、サイズが大きいoff_tのようないくつかのタイプが含まれている場合は、注意が必要です。 –
お使いのCのバージョンは?
C90では、標準的な方法として、signedまたはunsigned longにキャストして適切に印刷する方法があります。私はsize_tについて%zを見たことがありますが、HarbisonとSteeleはprintf()の下でそれを言及していませんが、ptrdiff_tなどで助けにならない場合もあります。
C99では、様々な_t型が独自のprintfマクロを持っています。"Size is " FOO " bytes."
のようなものですが、詳細は分かりませんが、それはかなり大きな数値形式のインクルードファイルの一部です。
H&Sのどのエディション - 第5回はほぼ確実に言及しています... –
第4版 - 更新する必要がありますか? –
私が思い出しているように、それを実行する唯一の方法は、結果を "unsigned long int"にキャストし、%lu
を使用することです。
man 3 printf
で(C99用)
ptrdiff_t
ため
size_t
と
%t
ため
%z
のためのすべてのショーのサポートを探し
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
が、これらの言及off_t
のどれも。通常、野生の提案は、off_t
の%u
の変換を提供しています。これは、私が知る限り「十分に正しい」ものです(unsigned int
とoff_t
は64ビットと32ビットシステムで同じです)。
私のシステム(OS X)は32ビットの 'unsigned int'と64ビット' off_t'を持っています。したがって、キャストによってデータが失われる可能性があります。 –
inttypes.hの書式設定マクロを使用します。 off_t型のためCross platform format string for variables of type size_t?
オフ_tのフォーマット方法には答えません。 – stepancheg
off_tがptrdiff_tのような符号付きのポインタサイズのint(正確な定義がわかりません)を仮定すると、PRIdPTRまたはPRIiPTRを使用します。 –
'off_t'型は、最近大部分の32ビットシステムである大容量ファイルをサポートする32ビットシステム上のポインタよりも大きくなっています。 –
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
にフォールバックする必要があります。これは小さすぎるため、他の実装では失敗します。
これははるかに良い答えですが、%zuをunsigned size_tに使用することについて忘れてしまいます。そして、intmax_tへのキャストは、どのプラットフォームでもoff_tが何であれ、素晴らしい解決策です。 –
POSIXは 'ssize_t'が' size_t'と同じサイズであることを保証しませんので、本当に移植性のあるコードでは 'int_t_t'に変換し、' off_t'と同様に '%jd'で出力する必要があります。 – nwellnhof
%luを使用してください。 Off_tは符号なしlongです。
あなたは*これを保証する仕様はありますか?特定のコンパイラ/ターゲットOSで何かが真実になっても、それが常に真実であるということではありません。 – CodesInChaos
それは、定義が異なるようですが、私は直感的には、非常に明白な理由から、オフセットの実装を署名付きの型にすると思います。 –
Microsoftの場合、その答えは異なります。 VS2013は主にC99に準拠していますが、「hh、j、z、tのプレフィックスはサポートされていません。 "で、32ビットプラットフォーム上の符号なし__INT32、64ビットプラットフォーム上の符号なし__int64" size_tの の型指定子O、off_t型としては、U、X、またはX. See VS2013 Size specification
と共に使用プレフィックスI(資本目) VC \ include \ sys \ types.hの長さで定義されています。
'off_t'は常に' long'で32ビットになります(64ビットWindowsでも 'long'に32ビットを使用します)。 – sourcejedi
私は受け入れられた答えが私のために記憶するのが難しいので(少なくともz
またはj
フラグを使用しており、それらはplatform independantではないようです)、この投稿を少なくとも2回見ました。
standardはsize_t
の正確なデータ長ははっきり言ったことがないので、私はそれらのいずれかを選択し、次にあなたが最初にあなたのプラットフォーム上で長さsize_t
を確認してくださいお勧め:
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
を私はstdint
タイプを使用しての代わりに示唆します一貫性のための生データ型。
C99とC11の場合、標準では '%zu'を使用して' size_t'値を出力できることを明示しています。 * 'uint32_t' /' uint64_t'フォーマット指定子を使って 'size_t'を出力することは決して避けてはいけません。なぜならこれらの型が互換性があるという保証はないからです。 – Sebivor
@devin:Mac OS Xで 'fopen'や' fseek'などを使っているときにそのタイプが見つかったと思います。オフセットに 'off_t'が使われています。 –