Selectivamente desactivar las advertencias del CCG para sólo una parte de una unidad de traducción?

StackOverflow https://stackoverflow.com/questions/965093

Pregunta

¿Qué es el CCG equivalente más cercano a este código preprocesador MSVC?

#pragma warning( push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

Tenemos código en cabeceras que comúnmente se incluyen los que no queremos para generar una advertencia específica. Sin embargo queremos archivos que incluyen los encabezados continúen generando esa advertencia (si el proyecto tiene que activar la advertencia).

¿Fue útil?

Solución

Este es posible en GCC desde la versión 4.6, o alrededor de junio 2010 en el maletero.

Este es un ejemplo:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */

Otros consejos

Lo más parecido es el GCC diagnóstico pragma , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". No está muy cerca de lo que quiere, y vea el enlace para más detalles y advertencias.

He hecho algo similar. Para el código de terceros, que no quería ver ninguna advertencia en absoluto. Así, en lugar de especificar -I/path/to/libfoo/include, solía -isystem /path/to/libfoo/include. Esto hace que el compilador de tratar a esos archivos de cabecera como "cabeceras de sistema" con el propósito de advertencias, y siempre y cuando no se habilita -Wsystem-headers, usted es mayormente segura. Todavía he visto algunas advertencias se escapan de allí, pero se redujo en más de la basura.

Tenga en cuenta que este solamente le ayuda si se puede aislar el código erróneo por incluir-directorio. Si es sólo un subconjunto de su propio proyecto, o mezclado con otro código, estás de suerte.

Esta es una expansión de la Matt Joiner respuesta .

Si no desea generar pragmas todo su código, se puede utilizar el _ Pragma operador :

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

DIAGNOSTIC_POP
foo(a); // Error
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top