2010-06-22 3 views
1

C99 표준을 그냥 감추고 있었는데 지금은 기억하지 못하는 것을 찾았습니다. strerror 함수 (섹션 7.12.6.2)에서 반환 된 포인터가 표준에서 정당화되지 않은 것으로 나타났습니다. :strerror가 const 한정 포인터를 반환하지 않는 이유는 무엇입니까?

함수 strerror 문자열에 대한 포인터를 반환, 내용이있는
로케일 고유 있습니다. 가리키는 배열은 프로그램,
에 의해 수정되지 않아야하지만 이후의 strerror 함수 호출로 덮어 쓸 수 있습니다.

같은 수정 문자열 대신 뭔가 반환하는이 기능에 대한 분명한 이유가 :

char const * const strerror(int errnum); 

가 또는 감사

char const * strerror(int errnum); 

아주 최소한.

+2

'const char *'만 반환하는 것을 의미한다고 생각합니다. 포인터 자체는 호출자에 속하므로 값을 변경해도 아무런 해가 없습니다. – u0b34a0f6ae

+0

@ kaizer.se 물론 감사합니다. – manneorama

답변

5

문자열 리터럴 유형과 같습니다. C89의 언어와 비슷합니다. const이 언어로 도입되기 전에 다시 연습 된 내용을 설명합니다. 이를 변경하면 현재 유효한 프로그램이 유효하지 않게됩니다.

+0

네, 맞습니다. 나는 직감이있었습니다. 하지만 이전 표준 구현에서 #define const이 문제를 해결하지 못했습니까? (나는 왜 사람이 그것을하고 싶지 않겠는가, 나는 단지 묻는다) :) – manneorama

+0

@manneorama : const int foo = 5; – tomlogic

+0

@manneorama,이 문제는 키워드 const가없는 구현에서 키워드 const를 수락하지 않고 strerror 또는 문자열 리터럴의 결과를 char *에 할당하거나 전달합니다. C++에 대해 잘 해낸 사람이라면 const 정확성을 개조하는 것이 고통 스럽습니다. – AProgrammer

1

이것은 많은 역사적 구현물이 오류 문자열을 "인쇄"하는 정적 버퍼를 사용하기 때문에 가능합니다.

1

정적 버퍼에 대한 응답이 잘못되었습니다. 반환 된 포인터 유형이 const인지 여부는 버퍼와 아무 관련이 없습니다. 리턴 타입은 const를 사용하지 않는 역사적인 코드와의 API 호환성과 완전히 관련이 있으며 아무런 해가 없습니다. 현대 const 인식 코드를 작성하는 사람은 반환 값을 즉시 사용하거나 포인터를 const 변수에 저장합니다.

+0

질문을 다시 읽기 : 지시 된 배열은 프로그램에 의해 수정되어서는 안되며, 이후에 strerror 함수를 호출하여 덮어 쓸 수 있습니다. – ninjalj

+1

내 대답을 다시 읽으십시오. 정적 버퍼는 strerror를 구현하는 데 사용될 수 있습니다 (바이너리 또는 mmap'd 현지화 파일에서 상수 오류 문자열에 대한 포인터를 반환 할 수 있기 때문에 바보이지만). 쓰기 가능한 정적 버퍼가 사용되는지 여부는 절대적으로 아무것도 아닙니다. 함수의 리턴 타입과 관련있다. const 포인터와 non-const 포인터는 비 const 버퍼를 가리킬 수 있으며이 경우 사용할 "올바른"형식은 const입니다. 비 const의 유일한 이유는 비 const 포인터 변수 또는 함수 인수에 결과를 넣으려는 기존의 const 비 인식 코드를 수용하기 위해서입니다. –

관련 문제