printf ファミリーを使用して、size_t 変数を移植可能に印刷するにはどうすればよいでしょうか? 質問する

printf ファミリーを使用して、size_t 変数を移植可能に印刷するにはどうすればよいでしょうか? 質問する

型の変数がありsize_t、 を使用してそれを印刷したいと考えていますprintf()。移植可能な形式で印刷するには、どのような書式指定子を使用すればよいでしょうか?

32 ビット マシンでは、%u正しいようです。 でコンパイルしましたg++ -g -W -Wall -Werror -ansi -pedanticが、警告は表示されませんでした。しかし、そのコードを 64 ビット マシンでコンパイルすると、警告が表示されます。

size_t x = <something>;
printf("size = %u\n", x);

warning: format '%u' expects type 'unsigned int', 
    but argument 2 has type 'long unsigned int'

これを に変更すると、予想どおり警告は消えます%lu

問題は、32 ビット マシンと 64 ビット マシンの両方で警告なしでコンパイルされるコードをどのように記述するかということです。

unsigned long編集: 回避策として、変数を のように十分な大きさの整数に「キャスト」し、 を使用して印刷することが1 つの答えになると思います%lu。これはどちらの場合も機能します。他に何かアイデアがないか探しています。

ベストアンサー1

修飾子を使用しますz:

size_t x = ...;
ssize_t y = ...;
printf("%zu\n", x);  // prints as unsigned decimal
printf("%zx\n", x);  // prints as hex
printf("%zd\n", y);  // prints as signed decimal

おすすめ記事