2009-09-14 6 views
8

size_tが無効であることを示すために人々は何を使用しますか? -1は機能せず、0は有効なサイズになります。size_tの値が無効です

+0

-1 "は機能しない" どう? –

+0

個人的には、私はPOSIX以外のシステムの使用を拒否しており、私は 'ssize_t'を利用しています。 –

答えて

10

おそらく((size_t)-1)

厳密に言えば、それは有効なサイズですが、あなたはこの1つを持っていたら、あなたは他を必要とする可能性が高いじゃない;-)

+1

C99のマルチバイト文字列関数のいくつかはこれを行います:異常状態を示すため '(size_t)( - 1)'や '(size_t)( - 2)'を返します。それは最適ではありませんが、実際には機能します。あなたの質問の理由がエラー処理の場合は、エラー変数へのポインタを渡す方が良いかもしれません(例えば、 '_Bool型のエラーフラグ、' int型のエラーコードまたは ' const char * ')を追加引数として使用します – Christoph

+0

ええ、それは一般的なイディオムです。 '(time_t)-1'もよく見かけることがあります。 –

+0

@ MichaelKrelin-hacker: '(time_t)-1'は少し異なります。標準では、現在の時刻を特定できない場合、time()によって返される値であることを具体的に示しています。 'time_t'はしばしば符号付きの型ですので、'(time_t)-1'は通常、エポックの1秒前です。 –

3

基本的にはできません。どんな価値を使用しても有効なものです。それが無効であることを示すフラグを渡す方が良い。

1

そして、何あなたはintが無効であることを示すために行うのですか? -1はintの有効な値です。これらのタイプには、「無効な」値が指定されていません。違法な価値を表現するために特定の値を決めることができます(これは決してあなたの変数が表現する値では決してありませんが、それはあなた自身の定義であり、人々が一般的に使用するものではありません)。

私はこのように個人的には好きではありません。私は別の変数bool IsValidを作成することを好みます。これは、そのsize_t変数の値が有効かどうかを示します。クラスを作成してカプセル化する方がよい場合もあります。

4

std :: stringについて言えば、size_tの無効な値はstd :: string :: nposです。 通常、size_tは符号なしであるため-1を使用しないでください。タイプ間の暗黙的な変換を行っているコンパイラで失敗した比較を得ることができます。

std :: stringsのnposは0XFFFFFFFFFFFFFFFFに設定されています。これは-1の2進数に等価です。また、unsigned size_tフィールドの最大許容値を評価します。

+0

'string :: size_t'ではなく、' size_t' ;-) –

+1

まだ答えの残りの部分純金です。純金! – Kieveli

+0

少なくともそれは輝きます;-) –

0

私のバージョンは次のとおりです。

#include <limits> 
#define invalid_index std::numeric_limits<size_t>::max() 
+3

'std :: numeric_limits :: max()'は 'C'でコンパイルされません。この質問にはタグが付いています。 – chux

関連する問題