2009-03-18 36 views
61

tengo:C++ de unsigned char * a const char *

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

El error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

Cuál es la forma correcta de lanzar aquí en el estilo C++?

+3

unsigned char se ha utilizado normalmente para la celebración de las cadenas unicode estilo, ¿está seguro de que desea emitir directamente en lugar de convertir los contenidos? –

Respuesta

39

reinterpret_cast

+36

ejemplo por favor? –

+5

@ jesses.co.tt Gracias por el voto en negativo. La característica clave de esta publicación que lo hace subir de categoría es su puntualidad. Las otras respuestas proporcionan varios detalles y se leen y votan mejor por separado. Si [@JaredPars answer] (http://stackoverflow.com/a/658924/11635) cubre lo que está buscando, lo usaría y/o lo recomendaría. Notarás que también he invertido el tiempo para mejorar el formato de esos. Realmente no veo el sentido de ampliar esta respuesta para abarcar el contenido de los demás. –

+1

bien, entiendo que sea racional aquí, y tomado como una página completa, acepto que no hubo necesidad de volver a articular ... Supongo que es difícil tomarse el tiempo y mirar la página completa y las marcas de tiempo en su lugar de juzgar cada respuesta por su propio mérito ... pero señalado (especialmente por alguien que tiene 55 veces más reputación de mi parte) –

6

Usted tendría que utilizar un reinterpret_cast<> como los dos tipos necesita modelar entre no están relacionados entre sí.

39

Trate reinterpret_cast

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

char * y const unsigned char * se consideran tipos no relacionados. Entonces quiere usar reinterpret_cast.

Pero si pasaras de const unsigned char* a un tipo que no sea const, primero necesitarías usar const_cast. reinterpret_cast no puede descartar una calificación const o volatile.

15

unsigned char * es básicamente una matriz de bytes y se debe usar para representar datos sin procesar en lugar de una cadena en general. Una cadena Unicode se representaría como wchar_t *

De acuerdo con el estándar de C++, una reinterpretación_cast entre char * sin signo y char * es segura ya que son del mismo tamaño y tienen la misma construcción y restricciones. Intento evitar reintrepret_cast incluso más que const_cast en general.

Si el yeso estático falla con lo que está haciendo, puede reconsiderar su diseño porque, francamente, si está utilizando C++, puede aprovechar lo que ofrece la parte "plus plus" y usar cadenas de caracteres y STL (también conocido como std :: basic_string podría funcionar mejor para usted)

-3

Hope it help. :)

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

Votación negativa: No es muy útil, y definitivamente no es la forma C++. – Lstor