2016-11-04 5 views
2

이 게시를 위해 가능한 한 작게 만들기 위해 실제 코드를 크게 줄였습니다.const 속성에 대한 함수 반환 경고

내 질문은 const 속성에 관한 것입니다. 나는이를 컴파일 할 때 ...

const char tmp[] = "anything"; 

int main(int argc, char *argv[]) { 
    /* my code */ 
    return 0; 
} 

char *somefunction (char *c) { 
    extern const char tmp[]; 
    /* my code */ 
    return tmp; 
} 

... 내가 얻을 :

경고 : 기본적으로 사용] 포인터 대상 유형의 리턴 폐기 'CONST'규정

코드가 잘 작동합니다.

tmp 문자열을 건드리지 않았으므로 return은 왜이 경고를 생성합니까?

const을 그대로두면 경고가 사라집니다.

+3

반환 유형이'char *'이고'const char *'가 아니기 때문에. 'char * somefunction (char * c)'를'const char * somefunction (char * c)'로 변경하십시오. –

+0

많은 ... 고마워요! – geohei

답변

2

무언가를 const으로 표시하면 컴파일러에게이를 수정하지 않을 것입니다.

귀하는 const char *을 가지고 있으며 char *으로 돌려 보내고 있습니다. 그건 tmp에게주고있는 const의 약속을 어기는 것입니다. 이 함수를 호출하는 코드는 const 포인터를 반환하지 않기 때문에 반환하는 값을 자유롭게 수정할 수 있습니다.

변경 somefunction 반환에 const char * :

const char *somefunction (char *c) { 
    ... 
+0

멀리 생각하지 않았다 (초보자 C ... 미안) ...! 감사합니다. – geohei

1

당신은 당신이 함수의 호출에 데이터를 "수정"할 수있는 가능성을 제공하는 포인터를 반환하는 것처럼. 이것은 당신이 바로 전에 무엇을했는지와 모순에 있습니다

, 즉 비 편집 가능한 일정하게 유지해야 뭔가에 대한 포인터의 선언입니다
extern const char tmp[]; 

. 컴파일러는 단지이 모순에 대해 경고합니다.