web-dev-qa-db-ja.com

ssize_tとintの使用

コード

私はoneの4つの可能な方法で書くことができる関数を持っています:

int do_or_die(int retval);
int do_or_die(ssize_t retval);
ssize_t do_or_die(int t retval);   
ssize_t do_or_die(ssize_t retval);   

そして、ライブラリ関数のこれらの方法のbothで呼び出されます:

written = do_or_die(write(...)); // POSIX write returns ssize_t
printed = do_or_die(printf(...)); // printf returns int

ご質問

  • どのプロトタイプを使用すればよいですか?
  • writtenおよびprintedにはどの型を指定する必要がありますか?

まだ1つのdo_or_die 関数。

この場合はC99を使用していますが、C11の答えが異なる場合は、将来的にもそれを知りたいと思います。

29
hyde

CまたはPOSIX標準には、sizeof(int) >= sizeof(ssize_t)の保証も、その逆もありません。通常、ssize_tintよりも大きくなりますが、C99の安全で移植可能なオプションは、引数と戻り値の代わりにintmax_tを使用することです。

あなたがwrtを持っている唯一の保証。 intssize_tの関係は次のとおりです。

  • intは、ISO Cごとに少なくとも[-2 ^ 15 ... 2 ^ 15-1]の範囲の値を格納できます
  • ssize_tは、POSIXごとに少なくとも[-1 ... 2 ^ 15-1]の範囲の値を格納できます( _POSIX_SSIZE_MAX を参照)。

(興味深いことに、ssize_tがその正の範囲の負の対応物を格納できるという保証すらありません。これは、署名されたsize_tではなく、エラー値を持つ「サイズタイプ」です。

43
Fred Foo

方法でタイプを使用します。

  • signed型とunsigned型を混在させないでください。
  • 大きな型の値を切り捨てないで、小さな型に格納します(オーバーフロー/アンダーフロー)

_ssize_t_はintのエイリアスかもしれませんが、それは標準Cではなく、環境に固有かもしれません。

プログラムが特定の環境で実行される場合、sizeof(ssize_t) <= sizeof(int)かどうかを確認し、intを使用します。そうでない場合は、他のタイプTを使用します。ここで、sizeof(T)sizeof(int)sizeof(ssize_t)の両方以上です。

5
LihO