계속해서 C를 공부하고 있는데 얼마전부터 거슬리는 에러가 있었다
바로 char *
인데
...
char * arr = "Hello, World!";
...
위 코드와 같이 선언을 하면 ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
라는 메세지와 함께 컴파일 에러가 발생한다
const char*
로 바꿔주면 된다고 해서 그냥 별 생각없이 쓰던 중 책에 있는 예제를 타이핑하다가 또 마주하게되서 좀 제대로 찾아보게 되었다.
이러한 에러는 gcc로 컴파일 했을 때는 발생하지 않지만, g++로 컴파일 했을때 발생한다고 한다.
그 이유는 C의 경우는 업데이트가 늦지만 C++은 비교적 빠르기 때문이라고 한다.
에러가 발생하는 이유는 문자열 상수
이기 때문이다.
문자열 상수는 const char*
형식으로 작성하는 것이 맞다.
왜냐하면 문자열 상수는 프로그램을 컴파일하고 실행하면 문자열 상수를 변경하는 것이 불가능하기 때문이다.
그렇기 때문에 변경할 수 없음을 알리는 const
를 사용하는 것이 맞는 문법이다.
이전 C/C++ 컴파일러는 개발자가 문자열 상수를 편하게 사용할 수 있도록 const char *
형식 이외에 char *
형식도 사용할 수 있게 허용했었다.
그 이유는 아래 코드와 같이 문자열 상수를 const char *
형식으로만 사용한다면 print 함수에 문자열 상수를 인자로 사용할 경우 char *
형식으로 형 변환(casting) 해야하는 불편함이 있기 때문이다.
#include <stdio.h>
void Print(char * str) {
printf("%s \n", str);
}
int main() {
Print((char *)"hello, world!");
return 0;
}
이는 C++에서 나같은 초보 개발자들을 위해서 바꾸는 중이라고 한다.
그 이유는 앞서 설명했던 것처럼 문자열 상수는 변경이 불가능하지만 실수로 변환하려고 하면 프로그램을 실행할 때, 메모리 쓰기 접근 위반
이 발생하는데 이런 문제가 컴파일할때 에러로 나타나지 않기 때문에 문제를 찾아내기가 어렵다는 문제가 있다.
char * str = "Hello, World!";
*str = 'Y';
// 쓰기 접근 위반 오류 발생, 컴파일 오류 없음
const char * str = "Hello, World!";
*str = 'Y';
// 컴파일 오류 발생
이제는 char *
선언은 안되니 const char *
를 사용하는 걸로 하자
** 참고로 const로 선언하면 매개변수도 const까지 붙여줘야 한다.
이 글은 프로그래머 김성엽님의 블로그를 참조하여 작성했습니다.