Cómo deshacerse de las advertencias de `conversión obsoleta de constante de cadena a 'char*'` en GCC

Resuelto Josh Matthews asked hace 16 años • 23 respuestas

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 charsugerencias. 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?

Josh Matthews avatar Sep 13 '08 01:09 Josh Matthews
Aceptado

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 charen cadenas charasignadas 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;
}
John avatar May 31 '2013 23:05 John

Creo que pasar -Wno-write-strings a GCC suprimirá esta advertencia.

DGentry avatar Sep 12 '2008 18:09 DGentry

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.

BlackShift avatar Feb 12 '2009 12:02 BlackShift

Consulte el soporte de Diagnostic Pragma de GCC y la lista de opciones de advertencia -W .

Para GCC, puede utilizar #pragma warningdirectivas como las que se explican aquí .

Rob Walker avatar Sep 12 '2008 18:09 Rob Walker

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 sedcomando. 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.

Konrad Rudolph avatar Sep 12 '2008 18:09 Konrad Rudolph