c++ - forbids - error warning deprecated conversion from string constant to char*''[- wwrite strings
advertencia: conversión obsoleta de una cadena constante a ''char*'' '' (3)
Posible duplicado:
¿Cómo deshacerse de ladeprecated conversion from string constant to ''char*''
advertenciasdeprecated conversion from string constant to ''char*''
en GCC?
Utilizo la siguiente función de la biblioteca que no puedo cambiar:
HRESULT DynamicTag(char * pDesc, int * const pTag );
Lo uso de la siguiente manera. He creado el objeto de la clase proporcionada por la biblioteca que implementa la función anterior.
int tag =0;
g_pCallback->DynamicTag("MyLogger", &tag);
Estoy recibiendo la siguiente advertencia:
warning: deprecated conversion from string constant to ''char*''
¿Cuál es la mejor manera de deshacerse de la advertencia anterior? No quiero asignar memoria dinámicamente.
Info: Estoy usando el compilador Vxworks6.8
Tratar con la biblioteca desconocida
Cuando se pasan literales y no otras cadenas const, y no está seguro de si la biblioteca está modificando la cadena, es fácil crear una copia temporal del literal en C ++ asignada a la pila (inspirada en Cómo deshacerse de la conversión obsoleta de la cadena constante) a ''char *'' `advertencias en GCC? ):
char strMyLogger[]="MyLogger";
g_pCallback->DynamicTag(strMyLogger, &tag);
Usa el reparto explícito para evitar un prototipo de biblioteca débil
En la mayoría de los compiladores, las conversiones explícitas evitan las advertencias, como:
g_pCallback->DynamicTag(const_cast<char *>("MyLogger"), &tag);
Nota: puede usar esto solo cuando esté seguro de que la función realmente nunca modifica la cadena pasada (es decir, cuando la función podría declararse como const char *, pero no lo está, tal vez porque el escritor de la biblioteca se ha olvidado de agregarla). Un intento de modificar una cadena literal es un comportamiento indefinido y en muchas plataformas provoca una caída. Si no está seguro, necesita hacer una copia grabable de la cadena, que puede asignarse dinámicamente o incluso apilarse, cuando conoce algún límite superior para el tamaño de la cadena.
Dado que no puedes cambiar DynamicTag
, debes cambiar la forma en que lo llamas. Puedes usar, por ejemplo:
char descr[] = "MyLogger";
g_pCallback->DynamicTag(descr, &tag);
Dado que pDesc se declara como un argumento [en] significa que probablemente no se cambiará, por lo que podría salirse con la suya, pero es un mal hábito.
Pase ese valor como una matriz.
int tag =0;
char arr[] = "MyLogger";
g_pCallback->DynamicTag(arr, &tag);