deprecated conversion from string constant to 'char*' 컴파일 경고 제거 방법

2016.08.22 20:19 컴퓨터/PC

deprecated conversion from string constant to 'char*' 컴파일 경고 제거 방법

컴파일 에러보다 무서운 것이 경고(warning)라고 생각합니다. 그래서 꼭 경고 메시지를 제거하는데, 이상 없던 코드에 경고문이 뜨네요. deprecated conversion from string constant to 'char*'.

코드를 여러 번 보아도 도대체 뭐가 이상하다는지 이해를 못 하겠습니다. 그러나 이유를 알고 보니 지금껏 컴파일 경고는 없었지만, 조심해 왔던 내용이었습니다. 바로 상수 문자열을 포인터 변수로 사용하는 문제입니다. 아래의 코드를 보면 이상이 없어 보이지만, 위험을 가지고 있는 코드입니다.

int main( void){

    char *str= "badayak.com";
}

어떤 문제가 있다는 것일까요? 이렇게 실수할 수 있습니다.

int main( void){

    char *str= "badayak.com";

    *str = 'B';
}

첫 번째 문자를 대문자로 바꾸려던 것인데, 포인터로 정의한 상수 문자열은 코드 영역에 있기 때문에 실행 중에 수정하면 세그멘테이션 오류를 발생합니다. 이렇게 눈에 뻔히 보이는 잘못을 하지 않겠지만, 코드가 복잡해지거나 다른 파일에 저장된 함수에서 실수할 수 있습니다.

int main( void){

    char *str= "badayak.com";

    func( str);
}

...............string_funcs.c..................

void func( char *ptr){

    *ptr = "B";
}

이런 잘못을 잡으려면 실수라는 것을 깨닫게 해 주어야 하는데 가장 간단한 방법은 상수 문자열이므로 상수답게 처리하는 것입니다. 포인터 변수에 const만 붙여도 컴파일이 안 됩니다.

int main( void){

    const char *str= "badayak.com";

    *str = 'B';           <--- 컴파일 에러
}

당연히 거기서도 실수가 있다면 컴파일 에러가 발생하겠죠?

#define 상수 문자열도 마찬가지

상수 문자열을 #define 문으로 많이들 사용하지요? #define으로 선언된 상수 문자열 사용도 아래와 같이 사용하면 당연히 같은 경고가 발생합니다.

#define     BADA_YAK      "badayak.com"

char *ptr = BATA_YAK;

또한, 아래의 경우도 컴파일 경고입니다.

void func( char *ptr){
}

#define     BADA_YAK      "badayak.com"

int main( void){
  
    func( BADA_YAK);                  <-- 경고
    func( "badayak.com" );           <-- 경고
}

컴파일 경고를 제거하려면 func()에 const를 삽입합니다.

void func( const char *ptr){
}

안전한 코드가 최고죠. ^^

신고
이 댓글을 비밀 댓글로