programing

문자열 상수에서 'char*'로의 변환이 C에서는 유효하지만 C++에서는 무효인 이유

newsource 2022. 7. 28. 23:55

문자열 상수에서 'char*'로의 변환이 C에서는 유효하지만 C++에서는 무효인 이유

C++11 Standard (ISO/IEC 14882:2011)는 다음과 같이 기술하고 있습니다.§ C.1.1:

char* p = "abc"; // valid in C, invalid in C++

C++에서는 String Literal로의 포인터가 크래시로 이어지기 때문에 문제가 없습니다.그런데 왜 C에서 유효할까요?

C++11에는 다음과 같은 기능도 있습니다.

char* p = (char*)"abc"; // OK: cast added

즉, 첫 번째 문장에 깁스를 추가하면 유효하게 됩니다.

왜 캐스팅이 두 번째 문장을 C++로 유효하게 만들며 첫 번째 문장과 어떻게 다른가?아직도 해롭지 않나요?만약 그렇다면, 왜 기준에서 괜찮다고 했을까요?

C++03 까지는 첫 번째 예는 유효하지만 권장되지 않는 암묵적 변환을 사용했습니다.문자열 리터럴은 유형으로 취급해야 합니다.char const *(정의되지 않은 동작을 일으키지 않으면) 내용을 수정할 수 없기 때문입니다.

C++11에서는 폐지된 암묵적 변환은 공식적으로 삭제되었기 때문에 (처음 예시와 같이) 이에 의존하는 코드는 컴파일되지 않습니다.

코드 컴파일을 허용하는 한 가지 방법은 암묵적 변환이 제거되었지만 명시적 변환은 여전히 작동하므로 캐스트를 추가할 수 있습니다.하지만, 저는 이것이 코드를 "수정"하는 것이라고 생각하지 않습니다.

코드를 제대로 수정하려면 포인터의 유형을 올바른 유형으로 변경해야 합니다.

char const *p = "abc"; // valid and safe in either C or C++.

C++로 허가된 이유에 대해서는(그리고 지금도 C로 되어 있다), 단순히 암묵적인 변환에 의존하는 많은 기존 코드가 있기 때문에 (적어도 공식적인 경고 없이) 그 코드를 깨는 것은 표준 위원회에게는 나쁜 생각처럼 보였다.

역사적 이유로 C에서 유효합니다.C는 기존에는 문자열 리터럴의 유형이char *보다는const char *단, 실제로는 수정할 수 없다고 기재되어 있습니다.

캐스트를 사용하면 기본적으로 컴파일러에 기본 유형 일치 규칙보다 더 잘 알고 있음을 알려주고 할당이 정상적으로 이루어집니다.

strdup을 사용할 수도 있습니다.

char* p = strdup("abc");

또는

char p[] = "abc";

여기서 지적한 바와 같이

다음의 몇개의 옵션과 같이 선언할 수 있습니다.

char data[] = "Testing String";

또는

const char* data = "Testing String";

또는

char* data = (char*) "Testing String";

언급URL : https://stackoverflow.com/questions/20944784/why-is-conversion-from-string-constant-to-char-valid-in-c-but-invalid-in-c