1. ホーム
  2. c

[解決済み] printf ファミリーを使用して、size_t 変数をポータブルに印刷するにはどうすればよいですか?

2022-01-28 20:44:58

質問

型の変数があります。 size_t を使用して印刷したい。 printf() . ポータブルに印刷するには、どのような書式指定子を使えばよいのでしょうか?

32bitマシンの場合。 %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ビットの両方のマシンでワーニングフリーにコンパイルできるようにするには、どのようにコードを書けばいいかということです。

編集:回避策として、変数を十分な大きさの整数に "cast"するのが一つの答えかもしれませんね、例えば unsigned long を使用して印刷します。 %lu . これならどちらの場合もうまくいくはずです。私は他のアイデアがあるかどうかを探しています。

解決方法は?

を使用します。 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