Así que estoy trabajando en una base de código extremadamente grande, y recientemente me actualicé a gcc 4.3, que ahora activa esta advertencia:
advertencia: conversión obsoleta de constante de cadena a 'char *'
Obviamente, la forma correcta de solucionar esto es encontrar cada declaración como
char *s = "constant string";
o llamada de función como:
void foo(char *s);
foo("constant string");
y hazlos const char
punteros. Sin embargo, eso significaría tocar 564 archivos, como mínimo, que no es una tarea que deseo realizar en este momento. El problema en este momento es que estoy corriendo -werror
, así que necesito alguna forma de sofocar estas advertencias. ¿Cómo puedo hacer eso?
Respuestas:
Creo que pasar
-Wno-write-strings
a gcc suprimirá esta advertencia.fuente
#pragma GCC diagnostic ignored "-Wwrite-strings"
.Cualquier función en la que pase literales de cadena
"I am a string literal"
debe usarchar const *
como tipo en lugar dechar*
.Si vas a arreglar algo, arréglalo bien.
Explicación:
No puede usar literales de cadena para inicializar cadenas que se modificarán, porque son de tipo
const char*
. Desechar los constness modificar más adelante ellos es un comportamiento indefinido , por lo que tiene que copiar susconst char*
cadenaschar
porchar
dentro asignados dinámicamentechar*
las cadenas con el fin de modificarlos.Ejemplo:
fuente
char *
/const char *
, por lo que en ese caso normalmente lanzo.char*
incluso para cadenas que no se modificarán. Si tomas un parámetro como achar const*
y lo pasas a una función estándar tomando unchar*
, golpearás eso. Si la función de biblioteca no manipulará la cadena, puede desechar laconst
.Tuve un problema similar, lo resolví así:
¿Es esta una forma apropiada de resolver esto? No tengo acceso para
foo
adaptarlo para aceptarconst char*
, aunque esa sería una mejor solución (porquefoo
no cambiam
).fuente
char **
enPyArg_ParseTupleAndKeywords
, hago algo como esto:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
Consulte el soporte de pragma de diagnóstico de gcc y la lista de opciones de advertencia -W (modificado: nuevo enlace a opciones de advertencia ).
Para gcc, puede usar
#pragma warning
directivas como se explica aquí .fuente
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 resolverse de una vez por todas con un solo
sed
comando. Sin embargo, no lo he probado, así que toma lo siguiente con un grano de sal.Es posible que esto no encuentre todos los lugares (incluso sin considerar las llamadas a funciones), pero aliviará el problema y permitirá realizar los pocos cambios restantes manualmente.
fuente
No puedo usar el interruptor del compilador. Entonces he convertido esto:
a esto:
fuente
Aquí se explica cómo hacerlo en línea en un archivo, para que no tenga que modificar su Makefile.
Luego puedes ...
fuente
Reemplazar
con
o si está llamando a la función:
reemplazar esto con
fuente
En vez de:
Esto funciona:
fuente
En C ++, use lo
const_cast
que se muestra a continuaciónfuente
Test string
es una cadena constante. Entonces puedes resolver así:o:
fuente
¿Por qué no solo usar el tipo de fundición?
fuente
Realice la conversión de texto de cadena constante a puntero de caracteres, es decir
fuente
En C ++, Reemplace:
con:
Y si quieres compararlo:
fuente
Trabajando con Arduino Sketch, tenía una función que causaba mis advertencias.
Para detener las advertencias, agregué el const delante del char * str y el char * sfind.
Todas las advertencias se fueron.
fuente
ver esta situación:
mire el campo de nombre, en gcc se compila sin advertencia, pero en g ++ lo hará, no sé por qué.
fuente
También puede crear una cadena de escritura desde una constante de cadena llamando
strdup()
.Por ejemplo, este código genera una advertencia:
Sin embargo, el siguiente código no lo hace (hace una copia de la cadena en el montón antes de pasarlo
putenv
):En este caso (y quizás en la mayoría de los demás), desactivar la advertencia es una mala idea, está ahí por una razón. La otra alternativa (hacer que todas las cadenas se puedan escribir de manera predeterminada) es potencialmente ineficiente.
¡Escucha lo que te dice el compilador!
fuente
putenv()
está lleno: no es una buena opción de ejemplo (al menos, no sin mucha más discusión sobre lo queputenv()
hace que en esta respuesta). Es una discusión completamente separada. (Tenga en cuenta que la especificación POSIX para el comportamiento deputenv()
es problemática, en base a las implementaciones heredadas de antes de que se definiera POSIX). IIRC, hubo un error en una versión reciente (este milenio) de GNU C Library que estaba relacionado con elputenv()
cambio de comportamiento, y ser cambiado de nuevo.)solo usa la opción -w para g ++
ejemplo:
g ++ -w -o simple.o simple.cpp -lpthread
Recuerde que esto no evita la desaprobación, sino que evita mostrar mensajes de advertencia en el terminal.
Ahora, si realmente desea evitar la degradación, use la palabra clave const como esta:
fuente
¿Por qué no utiliza la
-Wno-deprecated
opción para ignorar los mensajes de advertencia obsoletos?fuente
Este es tu verdadero problema, OMI. Puede probar algunas formas automatizadas de pasar de (char *) a (const char *), pero yo pondría dinero en ellas no solo trabajando. Tendrá que involucrar a un humano para al menos parte del trabajo. A corto plazo, simplemente ignore la advertencia (pero IMO la deja activada, o nunca se solucionará) y simplemente elimine -Werror.
fuente
Gracias por toda la ayuda. Escogiendo de aquí para allá viene esta solución. Esto compila limpio. No he probado el código todavía. Mañana tal vez...
Lo sé, solo hay 1 elemento en la matriz timeServer. Pero podría haber más. El resto fueron comentados por ahora para ahorrar memoria.
fuente
mire el campo de nombre, en gcc se compila sin advertencia, pero en g ++ lo hará, no sé por qué.
en
gcc (Compiling C)
, -Wno-write-strings está activo por defecto.en
g++ (Compiling C++)
-Wwrite-strings está activo por defectoPor eso hay un comportamiento diferente. Para nosotros, el uso de macros de
Boost_python
genera tales advertencias. Entonces usamos-Wno-write-strings
cuando compilamos C ++ ya que siempre usamos-Werror
fuente
Declarar cadena como a
const
resolverá el problema:fuente