1. ホーム
  2. c

[解決済み] ssize_t と int の使い分け

2022-03-06 22:46:48

質問

コード

で書ける関数は 一つ の4つの方法が考えられます。

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


で呼び出されます。 ともに これらの方法は、ライブラリ関数の場合です。

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

質問事項

  • どのプロトタイプを使用すればよいですか?
  • にはどのような型を与えるべきでしょうか? writtenprinted ?

最も堅牢で標準的なコードでありながら、たった1つの do_or_die 関数を使用します。

今回はC99を使用していますが、C11では回答が異なるようでしたら、今後のためにそちらも教えていただきたいです。

どのように解決するのですか?

POSIX規格には、以下のような保証はありません。 sizeof(int) >= sizeof(ssize_t) また、その逆も同様です。一般的に ssize_t よりも大きい。 int しかし、C99 の安全で移植性の高いオプションは intmax_t の代わりに、引数と戻り値を指定します。

の関係で唯一保証されるのは intssize_t があります。

  • int は、ISO C に基づいて少なくとも範囲 [-2^15 ... 2^15-1] の値を格納することができます。
  • ssize_t は POSIX に基づいて少なくとも [-1 ... 2^15-1] の範囲の値を格納することができます ( _POSIX_SSIZE_MAX ).

(興味深いことに、以下のような保証もありません。 ssize_t は、その正の範囲の負の対偶を格納することができます。これは符号化された size_t しかし、エラー値を持つ "サイズタイプ"です)。