unsigned char *에서 const char *로 C ++ 스타일 캐스트


80

나는 가지고있다:

unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));

오류: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

여기서 C ++ 스타일로 캐스팅하는 올바른 방법은 무엇입니까?


3
unsigned char은 일반적으로 유니 코드 스타일 문자열을 보관하는 데 사용되었습니다. 내용을 변환하는 대신 직접 캐스팅 하시겠습니까?
Greg Domjan

답변:


48

reinterpret_cast


6
@ jesses.co.tt 반대 투표에 감사드립니다. 이 게시물의 주요 기능은 적시성입니다. 다른 답변은 다양한 세부 정보를 제공하며 별도로 읽고 찬성하는 것이 가장 좋습니다. @JaredPars 답변 이 당신이 찾고있는 것을 포함 한다면 , 나는 그것을 사용하거나 찬성합니다. 내가 그 형식을 개선하기 위해 시간을 투자했다는 것을 알 수 있습니다. 나는 다른 사람들의 내용을 포괄하기 위해이 답변을 확장하는 요점을 실제로 보지 못합니다.
Ruben Bartelink 2013-08-20

3
네, 당신이 여기에 근거가 있음을 이해하고 전체 페이지로 취해 보았습니다. 다시 말할 필요가 없다는 것에 동의합니다 ... 시간을내어 전체 페이지와 타임 스탬프를 각각의 답변을 자신의 장점으로 판단하지만 ... (특히 나로부터
55 배

1
@ jesses.co.tt 걱정하지 마세요, 저는 당신의 관점을 이해하고 당신은 크게 틀리지 않았습니다. 솔직히 말해서 이와 같이 가장 빠른 총기류 응답으로 트래픽이 많은 태그에서 '경쟁'한 지 오래되었습니다. 그러나 그것이 옳은 일이더라도 대답을 삭제함으로써 이러한 수준의 담당자를 얻지 못합니다 (다른 날에는 행복하게 논쟁 할 것입니다!). 맞습니다, 우리는 장소를 어지럽히는 텍스트 벽이있어서 당신의 임무는 완수되었습니다. : P
Ruben Bartelink

23
특히 "FIRST!" 당신이 basic formatting.
OJFord

8
이것은 정말로 쓸모없는 "답변"입니다. 단순히 정보를 제공하지 않습니다.
OYRM

60

char *const unsigned char *관련이없는 유형으로 간주됩니다. 그래서 당신은 reinterpret_cast.

그러나 const unsigned char*const유형 으로 이동 하는 경우 const_cast먼저 사용해야 합니다. 또는 자격을 reinterpret_cast버릴 수 없습니다 .constvolatile


3
여기서 "관련이 없음"은 오해의 소지가 있습니다. 이것은 서로간에 캐스팅 할 수없는 인상을줍니다. 저는 2014 년 초안 인 "3.9.1 기본 유형"을 읽고 있는데 "A char, a signed char, a unsigned char는 동일한 양의 저장 공간을 차지하고 동일한 정렬 요구 사항을가집니다."라고 말합니다. 이것은 관계입니다. 또는 여기에 더 읽기 링크는 다음과 같습니다 en.cppreference.com/w/cpp/language/types#Character_types
빅터 Sergienko

52

시험 reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));

18

unsigned char *는 기본적으로 바이트 배열이며 일반적으로 문자열이 아닌 원시 데이터를 나타내는 데 사용해야합니다. 유니 코드 문자열은 wchar_t *로 표시됩니다.

C ++ 표준에 따르면 unsigned char *와 char * 사이의 reinterpret_cast는 크기가 같고 구성과 제약이 동일하기 때문에 안전합니다. 일반적으로 const_cast보다 reintrepret_cast를 더 많이 피하려고합니다.

만약 당신이하고있는 일에서 정적 캐스트가 실패한다면 솔직히 당신이 C ++를 사용하고 있다면 "플러스 플러스"부분이 제공하는 것을 활용하고 문자열 클래스와 STL (일명 std :: basic_string 당신을 위해 더 잘 작동 할 수 있습니다)


6

reinterpret_cast<>캐스트하는 두 유형은 서로 관련 이 없으므로 a를 사용해야합니다 .


6

다른 답변에 대한 댓글이 너무 많으므로 여기에 다른 답변을 남길 것입니다.

귀하의 경우을 사용할 수 있으며 사용해야합니다 reinterpret_cast<>.

str.append(reinterpret_cast<const char*>(foo()));

왜냐하면이 두 가지 유형은 다르지만 2014 년 표준 장에서는 둘 사이에 관계 3.9.1 Fundamental types [basic.fundamental] 있다고 말합니다 .

Plain char, signed charunsigned char세 가지 고유 한 유형으로 집합 적으로 좁은 문자 유형이라고합니다. A는 char, A는 signed char,와는 unsigned char같은 크기의 저장 용량을 차지하고 동일한 배향 요구 (3.11)가; 즉, 동일한 객체 표현을 갖습니다.

(선택은 내 것임)

다음은 사용 가능한 링크입니다. https://en.cppreference.com/w/cpp/language/types#Character_types

wchar_t유니 코드 / 멀티 바이트 문자열에 대한 사용 은 오래되었습니다. UTF-8을 사용할 때 wchar_t를 사용해야합니까?


-4

도움이 되었기를 바랍니다. :)

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.