私は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の答えが異なる場合は、将来的にもそれを知りたいと思います。
CまたはPOSIX標準には、sizeof(int) >= sizeof(ssize_t)
の保証も、その逆もありません。通常、ssize_t
はint
よりも大きくなりますが、C99の安全で移植可能なオプションは、引数と戻り値の代わりにintmax_t
を使用することです。
あなたがwrtを持っている唯一の保証。 int
とssize_t
の関係は次のとおりです。
int
は、ISO Cごとに少なくとも[-2 ^ 15 ... 2 ^ 15-1]の範囲の値を格納できますssize_t
は、POSIXごとに少なくとも[-1 ... 2 ^ 15-1]の範囲の値を格納できます( _POSIX_SSIZE_MAX
を参照)。(興味深いことに、ssize_t
がその正の範囲の負の対応物を格納できるという保証すらありません。これは、署名されたsize_t
ではなく、エラー値を持つ「サイズタイプ」です。
方法でタイプを使用します。
signed
型とunsigned
型を混在させないでください。_ssize_t
_はint
のエイリアスかもしれませんが、それは標準Cではなく、環境に固有かもしれません。
プログラムが特定の環境で実行される場合、sizeof(ssize_t) <= sizeof(int)
かどうかを確認し、int
を使用します。そうでない場合は、他のタイプT
を使用します。ここで、sizeof(T)
はsizeof(int)
とsizeof(ssize_t)
の両方以上です。