2017-11-12 31 views
2

내가 작업하고있는 C SDL 프로젝트에서 나는 가독성을 위해 typedef ed char * to str이다. 이제GCC가 왜이 '경고 된 한정자'경고를 내 보냅니 까?

내가 할 때

const str title = SDL_GetWindowTitle(win); 

SDL_GetWindowTitleconst char * 반환하는 경우, 내가 얻을 :

warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 

내가 char *에 유형을 변경하면 경고가 removeed된다

const char *title = SDL_GetWindowTitle(win); 

typedef는 형식에 대한 별칭 일뿐입니다. 따라서 변수를 str 또는 char *으로 선언하면 동등한 경고를받을 수 있습니다. 아니면 내가 놓친 뭔가가 ...?

CLI에서 GCC를 사용하고 있으므로 an IDE's fault이 아닙니다.

미리 Thx! 귀하의 경우

const str 
const char * 

다른 종류 있도록

+0

"* CLI의 * *"? – alk

+2

또 다른 좋은 예가 typedef 포인터 유형을 원하지 않는 이유입니다. – alk

+1

_ "가독성을 위해"_ - 동의하지 않으며, 이것이 왜 중요한지를 보여줍니다. 당신이 그것을 더 읽기 쉽다고 생각할 수도 있지만 관용적 인 코드를 작성하는 데 익숙한 숙련 된 사용자는 그렇지 않으므로 코드가 이상하고 바보가 될 것입니다. –

답변

5

typedef들, 매크로 대체하지 않습니다. 이 char * 유형의 const

char *const 

, 그래서 그것은 변경할 문자열을 가리키는 : 전자는 실제로 동일합니다. 귀하의 예에서는 title을 수정할 수 없지만 해당 포인터를 통해 *title을 수정할 수 있습니다 (실제적으로메모리가 아닌 경우 SDL_GetWindowTitle에 따라 달라짐).

수정하려면 typedefconst char *에 추가해야합니다.

+0

어, 처음에'const char * '에 대해'cstr'을 typedef''ed했지만 불필요한 concision이라고 느꼈습니다 ... 나는 그것을 되돌 리거나 그냥'str'을 제거 할 것입니다. – joH1