c++ gcc compiler-warnings

c++ - Deshabilitar GCC "se puede usar sin inicializar" en una variable particular



compiler-warnings (4)

Estoy recibiendo esta advertencia en una variable de pila:

warning: object.member may be used uninitialized in this function

En este caso, no deseo forzar la inicialización solo para deshacerme de la advertencia, ya que consume ciclos de CPU. La variable es una estructura POD, por lo que un memset no es de costo cero. Puedo verificar que la variable nunca se usa sin inicializar, por lo que me gustaría suprimir la advertencia.

En general, quiero la advertencia, pero no en esta variable en particular en este escenario en particular. ¿Cómo puedo suprimir la advertencia?

Parece que los diagnósticos de pragma son la forma correcta de ir pero requieren una versión bastante reciente de GCC (4.6)

No hay solución aceptable antes de que se conozca esa versión.


@Nawaz ha respondido la pregunta según lo formulado específicamente, pero ¿ha considerado que el hecho de que lo necesite puede indicar que está declarando su struct demasiado pronto / a un alcance menos anidado del apropiado? En general, sería mucho más preferible si pudiera declarar su struct en un punto en el que realmente pueda inicializarla en lugar de declararla antes y completarla en varias ubicaciones.

Además, aunque puede verificar que nunca se usó sin inicializar en este momento, ¿qué sucede si alguien agrega una nueva ruta de código en el futuro y no se inicializa correctamente? Si desactivas la advertencia, entonces se compilará en silencio y probablemente se romperá de forma inesperada. A menos que pueda probar que la inicialización está tomando una cantidad mensurable de la CPU de su programa, probablemente sea mejor hacer la inicialización por adelantado.


GCC diferencia entre no inicializado y autoinicializado, por ejemplo, compilación:

int main() { int i = i; return i; }

Con gcc -Wall -Wextra no emite advertencias, a menos que haya agregado explícitamente -Winit-self también, pero mi prueba rápida lo optimiza completamente.


Intenta hacer esto:

#pragma GCC diagnostic ignored "-Wuninitialized" foo(b); /* no diagnostic for this one */

Este pragma viene en tres sabores interesantes y útiles: warning , error , ignored . Ver 6.56.10 Pragmas de diagnóstico para sus usos. El enlace dice:

GCC permite al usuario habilitar o deshabilitar selectivamente ciertos tipos de diagnósticos, y cambiar el tipo de diagnóstico. Por ejemplo, la política de un proyecto puede requerir que todas las fuentes compilen con -Werror, pero ciertos archivos pueden tener excepciones que permiten tipos específicos de advertencias. O bien, un proyecto podría habilitar diagnósticos de forma selectiva y tratarlos como errores según las macros del preprocesador definidas.