Cómo deshacerse de las advertencias de `conversión obsoleta de constante de cadena a 'char*'` en GCC
Estoy trabajando en una base de código extremadamente grande y recientemente actualicé a GCC 4.3, lo que ahora activa esta advertencia:
Advertencia: conversión obsoleta de constante de cadena a 'char*'
Obviamente, la forma correcta de solucionar este problema es encontrar cada declaración como
char *s = "constant string";
o llamada de función como:
void foo(char *s);
foo("constant string");
y conviértalos en const char
sugerencias. Sin embargo, eso significaría tocar 564 archivos, como mínimo, lo cual no es una tarea que desee realizar en este momento. El problema ahora es que estoy ejecutando -Werror , por lo que necesito alguna forma de sofocar estas advertencias. ¿Cómo puedo hacer eso?
Cualquier función a la que pase cadenas literales "I am a string literal"
debe usar char const *
como tipo en lugar de char*
.
Si vas a arreglar algo, hazlo bien.
Explicación:
No puede utilizar cadenas literales para inicializar cadenas que serán modificadas, porque son de tipo const char*
. Desechar la constancia para modificarlas más tarde es un comportamiento indefinido , por lo que debe copiar sus const char*
cadenas char
en cadenas char
asignadas dinámicamente char*
para poder modificarlas.
Ejemplo:
#include <iostream>
void print(char* ch);
void print(const char* ch) {
std::cout<<ch;
}
int main() {
print("Hello");
return 0;
}
Creo que pasar -Wno-write-strings a GCC suprimirá esta advertencia.
Tuve un problema similar y lo resolví así:
#include <string.h>
extern void foo(char* m);
int main() {
// warning: deprecated conversion from string constant to ‘char*’
//foo("Hello");
// no more warning
char msg[] = "Hello";
foo(msg);
}
No tuve acceso a foo para adaptarlo para aceptar const char*
, lo cual sería una mejor solución porque foo no cambió m
.
Consulte el soporte de Diagnostic Pragma de GCC y la lista de opciones de advertencia -W .
Para GCC, puede utilizar #pragma warning
directivas como las que se explican aquí .
Si se trata de una base de código activa, es posible que aún desee actualizar la base de código. Por supuesto, realizar los cambios manualmente no es factible pero creo que este problema podría solucionarse de una vez por todas con un solo sed
comando. Sin embargo, no lo he probado, así que tómate lo siguiente con cautela.
find . -exec sed -E -i .backup -n \
-e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;
Es posible que esto no encuentre todos los lugares (incluso sin considerar las llamadas a funciones), pero aliviaría el problema y permitiría realizar los pocos cambios restantes manualmente.