2009-09-14 15 views
8

Kullanıcılar, size_t öğesinin geçersiz olduğunu belirtmek için neler kullanıyor? -1 çalışmıyor ve 0 geçerli bir boyut olabilir.Size_t için geçersiz değer

+0

Nasıl -1 "çalışmıyor" mu? –

+0

Şahsen, POSIX olmayan sistemleri kullanmayı reddediyorum ve "ssize_t" ürününe güveniyorum. –

cevap

10

Belki ((size_t)-1)?

Açıkçası, bu geçerli bir boyut, ama bu bir var bir kere başka ihtiyaç olası değil ;-)

+1

C99 çok baytlı dize işlevlerinden bazıları bunu yapar: anormal koşulları belirtmek için '(size_t) (- 1)' veya hatta '(size_t) (- 2)' döndürürler; Optimal değil, ama pratikte çalışıyor; Sorunun nedeni hata işleme ise, bir hata değişkenine bir işaretçiyi iletmek daha iyi bir fikir olabilir (örneğin, '_Bool' türünde bir hata bayrağı,' int' türünde bir hata kodu veya türünde bir hata iletisi gibi. const char * ') ek argüman olarak – Christoph

+0

Evet, bu yaygın bir deyim. Sıklıkla '(time_t) -1' de görebilirsiniz. –

+0

@ MichaelKrelin-hacker: '(time_t) -1 'biraz farklıdır; standart, özellikle şu anki zamanın belirlenememesi durumunda time() 'ile döndürülen değerin olduğunu söyler. Ve 'time_t' genellikle imzalı bir türdür, bu yüzden '(time_t) -1 'genellikle çağlardan 1 saniye öncedir. –

3

Temelde yapamazsınız. Kullandığınız değer, geçerli bir değer olabilir. Geçersiz olduğunu söyleyen bir bayrak geçsen iyi olur.

1

Ve ne bir int geçersiz olduğunu göstermek için yapıyorlar? -1, int için geçerli bir değerdir. Bu türler "geçersiz" değerler belirlemedi. Belirli bir değeri (normalde değişkeninizin neyi temsil ettiğinin değeri olamayabilir) yasadışı bir değeri temsil etmeye karar verebilirsiniz, ancak bu sizin kendi tanımınızdır ve insanların genel olarak kullandığı bir şey değildir.

Şahsen ben bu şekilde sevmiyorum. Bu size_t değişkeninin değerinin geçerli olup olmadığını söyleyen bool IsValid başka bir değişken oluşturmayı tercih ediyorum. Bazen bunları kapsüllemek için bir sınıf oluşturmak daha iyi olabilir.

4

std :: string hakkında konuşuyorsanız, o zaman size_t değeri geçersiz değer std :: string :: npos. Normal olarak -1 değerini kullanmamalısınız, çünkü bir size_t işaretsizdir ve türler arasında örtük dönüşümler yapan bir derleyicide başarısız karşılaştırmalar alabilirsiniz.

Bu söyleniyor ki, std :: dizelerinin npos'u, -1'in ikili eşdeğeri olan 0XFFFFFFFFFFFFFF ... olarak ayarlanmıştır. Ayrıca, imzasız bir size_t alanı için izin verilen maksimum değere de değerlendirir.

+0

bu 'string :: size_type' değil,' size_t' ;-) –

+1

Yine de ... yanıtın geri kalanı katı altındır. KATI ALTIN! – Kieveli

+0

En azından parlıyor ;-) –

0

Benim sürümü:

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

'std :: numeric_limits :: max()' bu soru etiketlendiği için 'C' içinde derleme yapmıyor. – chux

İlgili konular