[C언어/C++] char *과 const char * 차이 (E0144 에러)

1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    char* p = “abcd”;
    printf(p);
}
cs

C++을 공부하다보면 분명 검색해서 나오는 예제에는 char * 을 사용해서 문자열을 선언했는데 막상 본인의 컴파일러로 해당 예제를 복사해 붙여넣으면

E0144 (“const char *”형식의 값을 사용하여 “char*” 형식의 엔터티를 초기화할 수 없습니다.) 에러가 뜨면서 컴파일에 실패하는 경우가 있을 것이다.

이 오류는 설명에 나와있듯이 const char*을 사용하면 해결이 되는데 char*과 const char *의 차이를 설명하자면 char *은 변수에 문자, 문자열이 저장된 메모리의 첫 주소를 저장할수 있는 포인터 변수이고 const char *또한 같은 기능을 같고 있지만 포인터가 가리키는 변수의 내용은 변경이 불가능하다.

그럼 도대체 왜 다른 예제들에선 char *을 그대로 쓰고있고 본인의 컴파일러에선 오류가 발생하게 되는것일까?

그 이유는 바로 본인의 컴파일러가 최신의 컴파일러이기 때문인데 일단 의미적으로 봤을때는 문자열 상수를 지정하는 것이기에 const char * 형식이 옳다.

왜냐하면 문자열 상수는 프로그램이 컴파일 되고 나면 문자열 변수와는 다르게 각각의 문자를 개별적으로 변경하는것이 불가능 한게 맞기 때문에 변경할 수 없을을 강조하는 const를 사용하는것이 올바른 문법적 표현이기 때문이다.

하지만 이전까지의 C, C+ 컴파일러는 문자열 상수를 const char * 형식으로만 사용하게 된다면 특정 조건에선 char * 형식으로 반드시 형 변환을 해야하는 경우도 있었기에 문자열 상수를 개발자가 편하게 사용할 수 있도록 const char * 뿐만 아니라 char * 형식의 포인터에도 문자열 상수를 저장이 가능하도록 허용했었는데 편리한 부분도 있긴 했었지만 컴파일은 정상적으로 이뤄지더라도 실행시에는 오류가 발생하는 경우도 있는데 이 부분을 초보 개발자들은 어떤 문제인지 알아 차리기 힘들기 때문에 최근 C++언어가 초보자들을 더욱더 배려하는 형태로 문법과 컴파일러들을 수정하고 있는 추세라 여러분의 최신 컴파일러에서는 오류가 발생하게 되는 것이다.

즉 컴파일러의 설정이 최근에 들어와서 바뀐것이 문제이기 때문에 그래도 본인은 char * 에 문자열을 선언하고 싶다면

프로젝트 속성설정에 들어가서

C/C++ >> 언어 탭으로 들어가서 준수 모드를 아니요로 설정해주면 된다.

관련글

제목 작성자 작성일