C言語でプラットフォームに依存しないsize_tの書式指定子?
-
22-09-2019 - |
質問
私はCで型size_t
の変数をプリントアウトしたいが、size_t
が異なるアーキテクチャ上の異なる変数の型にエイリアスされることが表示されます。例えば、一つのマシン上で(64ビット)は、次のコードは、任意の警告をスローしない
size_t size = 1;
printf("the size is %ld", size);
私の他のマシン上で(32ビット)上記のコードは、次の警告メッセージを生成します。
を警告:フォーマット '%LD' を期待タイプ 'long int型*' が、引数3タイプがあります 'size_tの*'
は、私は、これは私の64ビットマシンsize_t
はlong int
("%ld"
)にエイリアスされている上に、私の32ビットマシンsize_t
上のに対し、別の型にエイリアスされるように、ポインタの大きさの違いによるものであると思われます。
書式指定子はsize_t
のために特別にありますか?
解決
はい:z
長修飾子を使用します:
size_t size = sizeof(char);
printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size); // hex size_t
利用可能である他の長さ修飾子はhh
(char
用)、(h
用)short
、(l
用)long
、(ll
用)long long
、(j
用)intmax_t
、(t
用)ptrdiff_t
、及びL
(ありますlong double
のため)。 C99標準の§7.19.6.1(7)を参照してください。
他のヒント
はい、あります。それは、(ANSI C99で指定)%zu
です。
size_t size = 1;
printf("the size is %zu", size);
size_t
が符号なしであることを注、従って%ld
二重間違っている:間違った長さ修飾子と間違ったフォーマット変換指定子。あなたが疑問に思う場合は、%zd
が(署名されている)ssize_t
ためです。
MSDN に、Visual Studioは "I" 接頭辞をサポートしていることを言います32ビットおよび64ビット・プラットフォーム上の移植可能なコードのために。
size_t size = 10;
printf("size is %Iu", size);
所属していません StackOverflow