와이드용 애드센스


[C++] C2440 : const char[]에서 char*로 변환할 수 없습니다 에러에 관하여 C++


[그림 1] C2440 ERROR


문자열 리터럴을 사용하기 위해서 char* 형태의 변수를 선언했을 때 [그림 1]과 같은 에러가 발생한다.
에러의 내용은 "aa"라는 문자열은 const(상수)값인데 변수에 그 값을 집어넣으려고 하니 에러가 발생한다는 것이다.


도대체 이런 에러가 왜 발생하는 걸까? 그 이유를 MSDN에서는 다음과 같이 설명하고 있다.



C2440 can be caused if you attempt to initialize a non-const char* (or wchar_t*) by using a string literal in C++ code, when the compiler conformance option /Zc:strictStrings is set. In C, the type of a string literal is array of char, but in C++, it is array of const char.
"C에서는 문자열 리터럴이 char의 배열이지만, C++에서는 const char의 배열이다."



즉, char *에 문자열 리터럴을 담는 방식은 C 스타일이며, C++에서는 잘못된 코딩방법이기 때문에 C2440 오류가 발생하는 것이다.

컴파일러 모드를 C 스타일로 변경하는 방법도 있으나, 이 경우 C++ STL을 사용할 수 없다.



C++ 스타일을 유지하면서 해당 에러를 해결하고 싶으면 아래와 같은 해결방법을 사용해보도록 하자.

1. pointer가 아닌 array 형식으로 선언
1
char s1[] = "aa";
cs


2. (char *) 형식으로 형변환(casting)
1
char *s1 = (char*)"aa";
cs


3. 자료형을 const char* 형태로 바꾸기
1
const char *s1 = "aa";
cs


4. const_cast<char*> 사용하기
1
char *s1 = const_cast<char*>("aa");
cs




※ Dev C++의 경우 5.11버전 기준으로 warning을 생성하지만 에러로 취급하지 않아 컴파일이 가능하다.

[참고 자료]
[MSDN - Compiler Error C2440]


 

덧글

댓글 입력 영역



애드센스