programing

C 및 C++ 문자열 리터럴의 유형은 무엇입니까?

coolbiz 2022. 8. 17. 22:24
반응형

C 및 C++ 문자열 리터럴의 유형은 무엇입니까?

C의 문자열 리터럴 유형은 무엇입니까?그런가요?char *또는const char *또는const char * const?

C++는요?

C에서 문자열 리터럴의 유형은char[]- 그렇지 않아const종류에 따라 다르지만 내용을 수정하는 것은 정의되지 않은 동작입니다.또, 같은 컨텐츠(또는 같은 컨텐츠의 충분한 수)를 가지는 2개의 다른 문자열 리터럴이 같은 어레이 요소를 공유할 수도 있고 공유할 수도 있습니다.

C99 표준 6.4.5/5 "문자열 리터럴 - 의미론"에서:

변환 단계 7에서는 문자열 리터럴 또는 리터럴에서 생성되는 각 멀티바이트 문자 시퀀스에 값 0의 바이트 또는 코드가 부가됩니다.그런 다음 멀티바이트 문자 시퀀스를 사용하여 시퀀스를 포함하기에 충분한 정적 스토리지 기간 및 길이의 배열을 초기화합니다.문자열 리터럴의 경우 배열 요소에는 유형이 있습니다.char멀티바이트 문자 시퀀스의 개별 바이트로 초기화됩니다.와이드 스트링 리터럴의 경우 어레이 요소에는 타입이 있습니다.wchar_t와이드 문자의 순서로 초기화됩니다.

요소의 값이 적절한 경우 이들 배열이 구별되는지 여부는 지정되지 않았습니다.프로그램이 이러한 배열을 수정하려고 하면 동작은 정의되지 않습니다.

C++에서는 "일반 문자열 리터럴은 n의 배열 유형을 가집니다.const char" (2.13.4/1 "String Literals" 이후).그러나 문자열 리터럴로의 포인터를 비수식 포인터로 쉽게 변환하는 특별한 경우가 있습니다(4.2/2 "Array-to-pointer conversion").

와이드 문자열 리터럴이 아닌 문자열 리터럴(2.13.4)은 "pointer to char" 유형의 r 값으로 변환할 수 있습니다.와이드 문자열 리터럴은 "pointer to wchar_t" 유형의 r 값으로 변환할 수 있습니다.

참고로 C/C++의 배열은 포인터로 쉽게 변환되기 때문에 문자열 리터럴은 C/C++의 배열과 마찬가지로 포인터 컨텍스트에서 자주 사용할 수 있습니다.


추가 편집: 이어지는 것은 문자열 리터럴 타입에 관한 C와 C++ 규격의 선택에 대한 근거에 대한 나의 추측입니다.따라서 신중하게 받아들이십시오(단, 수정사항이나 추가 세부사항이 있으면 코멘트해 주십시오).

C 규격은 문자열 리터럴 비정수 타입을 선택했다고 생각합니다.왜냐하면, 비정수 수식을 사용할 수 있을 것으로 예상되는 코드가 너무 많기 때문입니다.char리터럴을 가리키는 포인터입니다.언제?const스트링 리터럴에 대한 포인터를 만들었을 경우 한정자가 추가되었습니다(내가 틀리지 않았다면, 그것은 ANSI 표준화 시간 즈음에 이루어졌지만, K&R C가 1톤의 기존 코드를 축적하기 위해 주변에 있었다).char const*기존의 거의 모든 프로그램을 변경해야 했습니다.표준이 받아들여지는 좋은 방법은 아니지만...

스트링 리터럴이 C++로 바뀐 것은constqualified는 주로 리터럴 문자열이 "를 필요로 하는 과부하와 보다 적절하게 일치하도록 지원하기 위해 수행되었습니다.char const*" 인수.타입 시스템의 인식된 구멍을 메우고 싶은 욕구도 있었다고 생각합니다만, 어레이에서 포인터로 변환하는 특수한 케이스에 의해서, 그 구멍은 크게 다시 열리게 되었습니다.

표준의 Annex D는 "문자열 리터럴(4.2)에 대한 암묵적인 자격 변환은 권장되지 않는다"고 명시하고 있지만, 나는 여전히 너무 많은 코드가 깨질 것이라고 생각하여 컴파일러 구현자 또는 표준 위원회가 실제로 플러그를 뽑을 때까지 오랜 시간이 걸릴 것이라고 생각한다(다른 현명한 기술이 필요하지 않은 한).(그렇게 되면 구멍이 다시 뚫리지 않을까?)

C 문자열 리터럴에 유형이 있습니다.char [n]어디에n는 문자열 끝에 있는 암묵적인0 을 나타내는 문자수+1 입니다.

어레이는 정적으로 할당되지만, 할당되지 않습니다.const단, 이를 수정하는 것은 정의되지 않은 동작입니다.

포인터 타입이 있는 경우char *또는 불완전한 유형char [],sizeof예상대로 작동하지 않았습니다.

문자열 리터럴 만들기const는 C++의 관용어로 C 표준의 일부가 아닙니다.

여러 가지 역사적 이유로 현악 문자는 항상 종류였다.char[]주식회사.

초기(C90)에서는 문자열 리터럴을 변경하면 정의되지 않은 동작이 호출된다고 기술되어 있었습니다.

하지만 그들은 그러한 수정을 금지하지도 않았고, 문자열 리터럴을 만들지도 않았다.const char[]그게 더 말이 됐을 거예요이는 이전 코드와의 하위 호환성을 위한 것입니다.일부 오래된 OS(특히 DOS)는 문자열 리터럴을 수정해도 이의를 제기하지 않았기 때문에 주변에 그러한 코드가 많이 있었습니다.

최신 C 표준에서도 C는 여전히 이 결함을 가지고 있습니다.

C++는 C에서 동일한 결함을 상속받았지만, 이후 C++ 표준에서는 문자열 리터럴을 최종적으로 작성했습니다.const(C++03에서는 플래그가 사용되지 않게 되어, C++11에서는 최종적으로 수정됩니다).

옛날에는 같은 종류였다char[]. 현재 그것들은 종류이다.const char[].

언급URL : https://stackoverflow.com/questions/2245664/what-is-the-type-of-string-literals-in-c-and-c

반응형