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

나는 가지고있다:

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 ++ 스타일로 캐스팅하는 올바른 방법은 무엇입니까?



답변

reinterpret_cast


답변

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

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


답변

시험 reinterpret_cast

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


답변

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

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

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


답변

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


답변

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

귀하의 경우을 사용할 수 있으며 사용해야합니다 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를 사용해야합니까?


답변

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

const unsigned attribName = getname();
const unsigned attribVal = getvalue();
const char *attrName=NULL, *attrVal=NULL;
attrName = (const char*) attribName;
attrVal = (const char*) attribVal;