¿Cuál es el equivalente GCC más cercano a este código de 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 encabezados comúnmente incluidos que no queremos generar una advertencia específica. Sin embargo, queremos que los archivos que incluyen esos encabezados continúen generando esa advertencia (si el proyecto tiene esa advertencia habilitada).
Respuestas:
Esto es posible en GCC desde la versión 4.6, o alrededor de junio de 2010 en el tronco.
He aquí 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 */
fuente
#pragma GCC diagnostic [error|warning|ignored]
peropop
no está implementado / es compatible.Lo más parecido es el pragma de diagnóstico GCC ,
#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
. No está muy cerca de lo que desea, y consulte el enlace para obtener detalles y advertencias.fuente
#pragma
directiva, por lo que es más probable que cualquier cosa que sea específica de GCC se implemente como un__attribute__((foo))
.#pragma GCC push_options
para que pueda jugar con más que solo diagnósticos ... gcc.gnu.org/onlinedocs/gcc/…Yo hice algo similar. Para el código de terceros, no quería ver ninguna advertencia. Entonces, en lugar de especificar
-I/path/to/libfoo/include
, usé-isystem /path/to/libfoo/include
. Esto hace que el compilador trate esos archivos de encabezado como "encabezados del sistema" con el propósito de advertencias, y mientras no los habilite-Wsystem-headers
, estará seguro en su mayor parte. Todavía he visto algunas advertencias que se filtran, pero reducen la mayor parte de la basura.Tenga en cuenta que esto solo le ayudará si puede aislar el código infractor mediante el directorio de inclusión. Si es solo un subconjunto de su propio proyecto, o está mezclado con otro código, no tiene suerte.
fuente
Esta es una expansión de 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
fuente