2009-09-14 8 views
8

size_t가 잘못되었음을 나타내는 데 사람들이 사용하는 것은 무엇입니까? -1은 작동하지 않고 0은 유효한 크기 일 수 있습니다.size_t에 대한 값이 잘못되었습니다.

+0

어떻게 -1 "작동하지"는 무엇입니까? –

+0

필자는 개인적으로 비 POSIX 시스템 사용을 거부하고'ssize_t '를 사용할 수 있습니다. –

답변

10

아마도 ((size_t)-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'는 종종 signed 타입이기 때문에'(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로 설정됩니다. 또한 서명되지 않은 size_t 필드에 대해 허용되는 최대 값으로 평가됩니다.

+0

은'string :: size_type'가 아니라'size_t'입니다 .--) –

+1

아직도 대답은 남았습니다. 단단한 금이다. 솔리드 골드! – Kieveli

+0

적어도 빛나네 ;-) –

0

내 버전은 다음과 같습니다

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

이 질문에 태그가 붙여져 있으므로'std :: numeric_limits :: max()'는'C '에서 컴파일되지 않습니다. – chux

관련 문제