wwrite warning strings from forbids error converting conversion constant c++ compiler-warnings

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 la deprecated conversion from string constant to ''char*'' advertencias deprecated 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);