web-dev-qa-db-ja.com

size_tまたはssize_tを使用する必要があります

私のコードでは、intまたはunsigned intは使用していません。ポータブル用にのみsize_tまたはssize_tを使用しています。例えば:

typedef size_t intc;    // (instead of unsigned int)
typedef ssize_t uintc;  // (instead of int)

strlenstringvector...はすべてsize_tを使用するため、通常はsize_tを使用します。そして、ssize_tが負の場合にのみ使用します。

しかし、私はそれを見つけます:

符号なし整数型は、ストレージをビット配列として扱う用途に最適です。正の整数を表すためにもう1ビットを得るために、intの代わりに符号なしを使用することは、ほとんどお勧めできません。符号なしの変数を宣言することにより、いくつかの値が正であることを保証する試みは、通常、暗黙の変換規則によって無効にされます。

本の中で C++プログラミング言語

だから私は困惑しています。私が間違っている? STLが本の提案に従わないのはなぜですか?

74
hgyxbll

ssize_tは、戻り値が有効なサイズであるか、エラーを示す負の値である可能性がある関数に使用されます。少なくとも[-1, SSIZE_MAX]の範囲に値を格納できることが保証されています(SSIZE_MAXはシステムに依存します)。

したがって、バイト単位のサイズを返す場合は常にsize_tを使用し、バイト単位のサイズまたは(負の)エラー値を返す場合はssize_tを使用する必要があります。

参照: http://pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

123
maditya

ssize_tは標準に含まれておらず、移植性がありません。オブジェクトのサイズを処理するときは、size_tを使用する必要があります(ポインターの違いにはptrdiff_tもあります)。

27
user657267