2009-09-14 18 views
8

Co ludzie używają do oznaczenia, że ​​size_t jest nieprawidłowe? -1 nie działa, a 0 może być prawidłowym rozmiarem.Niepoprawna wartość dla size_t

+0

Jak -1 "nie działa"? –

+0

Osobiście odmawiam używania systemów innych niż POSIX i polegam na dostępnym 'ssize_t'. –

Odpowiedz

10

Być może ((size_t)-1)?

Ściśle mówiąc, to jest prawidłowy rozmiar, ale skoro masz ten jeden nie jesteś prawdopodobnie potrzebować każdy inny ;-)

+1

niektóre z funkcji wielobajtowych C99 robią to: zwracają '(size_t) (- 1)' lub nawet '(size_t) (- 2)' w celu oznaczenia anormalnych warunków; nie jest optymalny, ale działa w praktyce; jeśli przyczyną twojego pytania jest obsługa błędów, lepszym pomysłem może być przekazanie wskaźnika do zmiennej błędu (np. flaga błędu typu '_Bool', kod błędu typu' int' lub komunikat o błędzie typu ' const char * ') jako dodatkowy argument – Christoph

+0

Tak, to typowy idiom. Często możesz też zobaczyć '(time_t) -1'. –

+0

@ MichaelKrelin-hacker: '(time_t) -1' jest trochę inny; standard wyraźnie mówi, że jest to wartość zwrócona przez 'time()', jeśli nie można ustalić bieżącego czasu. A 'time_t' jest często typem podpisanym, więc' (time_t) -1' jest zwykle 1 sekundę przed epoką. –

3

Zasadniczo nie można. Bez względu na to, jaką wartość użyjesz, może być ona ważna. Lepiej przekazać flagę, że jest ona nieważna.

1

A co zrobić, aby oznaczać, że int jest nieważny? -1 jest poprawną wartością dla int. Te typy nie mają oznaczonych "nieprawidłowych" wartości. Możesz zdecydować się na wybraną wartość (która nigdy nie może być wartością, którą reprezentuje twoja zmienna), aby reprezentować nielegalną wartość, ale to jest twoja własna definicja, a nie coś, co ludzie zazwyczaj używają.

Osobiście nie podoba mi się ten sposób. Wolę utworzyć inną zmienną, bool IsValid, która powie, czy wartość tej zmiennej size_t jest poprawna. Czasami może nawet lepiej stworzyć klasę, która je enkapsuluje.

4

Jeśli mówisz o std :: string, to nieprawidłową wartością size_t jest std :: string :: npos. Zwykle nie powinieneś używać -1, ponieważ size_t jest unsigned i możesz uzyskać nieudane porównania na kompilatorze wykonującym niejawne konwersje między typami.

Na przykład stroję std :: strings ma wartość 0XFFFFFFFFFFFFFF ..., która jest wartością binarną równą -1. Sprawdza także maksymalną dozwoloną wartość niepodpisanego pola size_t.

+0

to 'string :: size_type', a nie' size_t' ;-) –

+1

Nadal ... reszta odpowiedzi jest solidnym złotem. CZYSTE ZŁOTO! – Kieveli

+0

Przynajmniej świeci ;-) –

0

Moja wersja jest:

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

'std :: numeric_limits :: max()' nie kompiluje się w 'C', ponieważ to pytanie jest oznaczone. – chux

Powiązane problemy