traducir traduccion tag significado play name ingles etiqueta español aleman c++ c gcc compiler-warnings pragma

c++ - traduccion - ¿Inhabilitar selectivamente las advertencias GCC para solo parte de una unidad de traducción?



tag significado en español (4)

¿Cuál es el equivalente de GCC más cercano a este código de preprocesador de 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 un código en los encabezados incluidos comúnmente que no queremos generar una advertencia específica. Sin embargo, queremos que los archivos que incluyen esos encabezados sigan generando esa advertencia (si el proyecto tiene habilitada esa advertencia).


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

Si no desea generar pragmas en todo su código, puede usar el operador _Pragma :

#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


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

Aquí hay 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 */


He hecho algo similar. Para el código de un tercero, no quería ver ninguna advertencia en absoluto. Entonces, en lugar de especificar -I/path/to/libfoo/include , utilicé -isystem /path/to/libfoo/include . Esto hace que el compilador trate esos archivos de encabezado como "encabezados de sistema" con el propósito de advertencias, y siempre y cuando no habilite -Wsystem-headers , en su mayor parte -Wsystem-headers salvo. Todavía he visto algunas advertencias que escapan de allí, pero reducen la mayoría de la basura.

Tenga en cuenta que esto solo lo ayuda si puede aislar el código ofensivo mediante include-directory. Si solo es un subconjunto de tu propio proyecto, o entremezclado con otro código, no tienes suerte.


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