문자열 상수에서 '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
'programing' 카테고리의 다른 글
vue-router를 사용한VueJ 서버 루트로 리다이렉트하는 방법 (0) | 2022.07.28 |
---|---|
Mockito를 사용하여 추상 클래스 테스트 (0) | 2022.07.28 |
Vuex: 변환 시 평균 대괄호란 무엇입니까? (0) | 2022.07.28 |
로그백을 위해 루트 로깅 수준을 프로그래밍 방식으로 변경하는 방법 (0) | 2022.07.28 |
확인란에서 ID를 가져와 vue3에서 선택되었는지 확인하는 방법 (0) | 2022.07.28 |