私は次のものを持っています
size_t i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]\n", i, k);
コンパイル時に次の警告が表示されます。
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
スプリントを使用してこれを実行すると、次のようになりました:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
アドバイスをありがとう
size_t
が実際にunsigned long
(32ビット)である場合、unsigned int
(おそらく64ビット)と同じであると期待しているように聞こえます。両方の場合で%zu
を使用してみてください。
しかし、私は完全に確実ではありません。
試してみる
#include <inttypes.h>
...
printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);
z
はsize_t
と同じ長さの整数を表し、PRIu32
マクロ、 C99ヘッダーで定義inttypes.h
は、符号なし32を表します-ビット整数。
必要なのは、書式指定子と型が一致することだけで、いつでもキャストしてそれを実現できます。 long
は少なくとも32ビットなので、%lu
と(unsigned long)k
は常に正しいです。
uint32_t k;
printf("%lu\n", (unsigned long)k);
size_t
は扱いにくいため、C99で%zu
が追加されました。それを使用できない場合は、k
のように扱います(long
はC89で最大の型であり、size_t
が大きくなる可能性は非常に低いです)。
size_t sz;
printf("%zu\n", sz); /* C99 version */
printf("%lu\n", (unsigned long)sz); /* common C89 version */
渡そうとしている型に合った書式指定子を取得できない場合、printf
は配列からメモリを読みすぎたり、読みすぎたりするのと同じことをします。明示的なキャストを使用して型を一致させる限り、移植性があります。
PRI *マクロを使用したくない場合、ANY整数型を印刷する別の方法は、intmax_t
またはuintmax_t
にキャストし、それぞれ"%jd"
または%ju
を使用することです。これは、PRI_ *マクロが定義されていないPOSIX(または他のOS)タイプ、たとえばoff_t
で特に役立ちます。