c++ - ¿Cómo deshabilito una advertencia de gcc que no tiene un interruptor de línea de comando?
command-line gcc-warning (4)
Me sale la siguiente advertencia:
warning: ''X'' is initialized and declared ''extern''
y parece que no es gran cosa y podría deshabilitarlo. Cambiar el código no es realmente una buena idea en mi caso porque no tengo control sobre el código, solo necesito compilarlo. Entonces quiero deshabilitar la advertencia.
Si tenía una tecla
-WSomeDefect
lado, entonces podría usar un interruptor de línea de comando
-Wno-SomeDefect
pero parece que no hay un interruptor distinto para esta advertencia.
¿Cómo desactivo dicha advertencia?
Hay cientos de instancias de esta advertencia e inundan la salida del compilador. Difícil de ignorar.
Si se trata de una biblioteca externa, hay forma de reducir esta advertencia a un solo informe en conflicto. Sospecho que puedes vivir con un solo mensaje de advertencia.
Envuelva esta API de biblioteca con sus propias funciones / métodos. Puede nombrarlos 1: 1 usando un espacio de nombres diferente para evitar modificaciones complejas del código propio donde se usa esta API. De esta manera, esta advertencia se informará solo cuando se incluya la fuente, incluido el archivo de encabezado problemático. El objetivo es incluir el archivo de encabezado problemático solo una vez.
Dependiendo de cómo se vea esta API, puede ser más difícil de hacer.
De todos modos, si se trata de una biblioteca de terceros, este enfoque hará que sea más fácil burlarse de esa biblioteca y escribir una prueba para su código.
No hay ninguna bandera específica para deshabilitar esto, lo cual es lamentable, pero existe la bandera
-w
que deshabilitará todas las advertencias, sin forma de volver a habilitarlas.
De los documentos de GCC :
-w
Inhibe todos los mensajes de advertencia.
Pero la mejor opción aquí es eliminar el
extern
de las declaraciones / definiciones de variables.
De esa manera, el compilador sabe que la variable está definida dentro de la unidad de traducción.
Puede ponerse en contacto con los propietarios del código para ver si pueden cambiarlo.
Para una respuesta directa a la pregunta planteada:
Como se puede ver en el código fuente de GCC, no hay un interruptor (semi) específico para deshabilitar esta advertencia.
Parece que solo se deshabilita al deshabilitar todas las advertencias (
-w
) o al incluir el código ofensivo como encabezado del sistema a través de
-isystem
, los cuales no son específicos en las advertencias suprimidas.
Aquí hay un informe de error abierto relacionado en GCC y un error meta abierto para casos similares de advertencias sin interruptores here .
Si no desea utilizar los dos mecanismos de supresión no específicos, probablemente tendrá que aplicar un parche en un indicador adicional a GCC o esperar a que se solucionen los errores para deshabilitar esta advertencia específica.
El código que produce esta advertencia
no
es
válido en C
y debe corregirse.
El lenguaje C requiere la emisión de "diagnósticos" (advertencias o errores) para infracciones de restricciones
como esta
, y no exige la existencia de ninguna forma de deshabilitarlos.
Creí (y sospecho que muchos otros lo hacen) que
extern
era una violación de restricción con un inicializador, ya que en uso normal
extern
solo proporciona una declaración, no una definición.
Sin embargo, por 6.9.2 ¶1:
Si la declaración de un identificador para un objeto tiene alcance de archivo y un inicializador, la declaración es una definición externa para el identificador.
Siendo que la gramática parece permitir
extern
con un inicializador, esta es una definición válida.
GCC tiene una opción
-w
que probablemente apagará la advertencia, pero a expensas de deshabilitar todas las advertencias sin capacidad de anular y volver a activar algunas.
Esto tendría sentido si fuera una violación de restricción y sería una señal para corregir el código no válido;
sin embargo, el código es válido y GCC debería proporcionar un mecanismo para no producir una advertencia falsa al respecto.
Como señaló Eljay en un comentario:
Las advertencias vienen en varias categorías: según el mensaje de diagnóstico estándar requerido; análisis estático similar a una pelusa del abuso / mal uso accidental del lenguaje común; opinión bien intencionada pero aún estilística (por ejemplo,
-Weffc++
); posiblemente demasiado pedante y / o minucias (por ejemplo,-Weverything
o-pedantic
). Las últimas categorías deberían tener formas de "exclusión voluntaria" para deshabilitar la advertencia específica, como en el caso del OP.
GCC generalmente trata de cumplir con este deber , la mayoría de las veces, y creo que valdría la pena informar al rastreador de errores de GCC la ausencia de una forma de desactivarla.