2016-12-21 101 views
3

組み込みプラットフォームでC89を使用しています。私はsize_tをプリントアウトしようとしましたが、それは動作しませんでした:%zu指定子はprintfに必要ですか?

#include <stdio.h> 
int main(void) { 
    size_t n = 123; 
    printf("%zu\n",n); 
    return 0; 
} 

代わりの123、私はzuを得ました。
他の指定子は正しく動作します。

size_tが存在する場合、zuprintfで利用できませんか?
ライブラリのベンダーに問い合わせる必要がありますか、それを除外できるライブラリの実装ですか?

+5

'z'プレフィックスましたC99で私は信じています。 –

+0

@KerrekSB Ok。それは注釈されていないようです。 http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

CのリファレンスでC標準について何か言わなければならないのはなぜですか? – mch

答えて

6

size_tが存在する場合は、printfでも使用できません。

size_t

は少なくともC89から存在が、それぞれの形式指定子%zu(具体的には長さ修飾子z)が唯一C99ので標準に添加しました。だから、

、あなたはC99(またはC11)を使用し、C89でsize_tを印刷しなければならなかったことができない場合は、あなただけの他の既存の型にフォールバックする必要がある、など:

printf("%lu\n", (unsigned long)n); 
+0

上記のコードは、 'unsigned long'が' n 'の最大可能値を収容するのに十分な大きさのプラットフォームであれば、必ずしも効率的ではありませんが、十分であることに注意してください。 'size_t')です。しかし、 'size_t'は' unsigned long'より大きくはないという保証はなく、 'n'が常に' unsigned long'に収まるという保証はありません。私はそれがどれほど頻繁に問題になるのかわかりません[sprintfバッファのサイズを計算すると、多くのプログラムが異なるトラブルに陥る可能性があります... – supercat

+0

... 10進形式のunsigned longの最大長出力される値はそれよりも長くなります]。 – supercat

関連する問題