¿Está utilizando #pragma warning push / pop de la manera correcta para alterar temporalmente el nivel de advertencia?

De vez en cuando es difícil escribir código C ++ que no emita advertencias. Sin embargo, tener advertencias habilitadas es una buena idea. Por lo tanto, a menudo es necesario desactivar las advertencias alrededor de una construcción específica y hacer que se habiliten en todas las otras partes de código.

He visto dos formas de hacerlo hasta ahora.

El primero es usar #pragma warning( push ) y #pragma warning( pop ) :

  #pragma warning( push ) #pragma warning( disable: ThatWarning ) //code with ThatWarning here #pragma warning( pop ) 

El segundo es usar #pragma warning( default ) :

  #pragma warning( disable: ThatWarning ) //code with ThatWarning here #pragma warning( default: ThatWarning ) 

El problema que veo en la segunda variante es que descarta el nivel de advertencia original: es posible que la advertencia haya estado desactivada antes o que su nivel de advertencia haya sido alterado. Usar el default descartaría esas alteraciones.

El primer enfoque parece limpio. ¿Hay algún problema con eso? ¿Hay alguna forma mejor de lograr lo mismo?

El primer método es la mejor manera de hacerlo, IMO. No tengo problemas con eso.

Simplemente tenga en cuenta que #pragma es específico del comstackdor, así que no espere que funcione en todos los comstackdores 🙂

Esto funcionará con múltiples comstackdores (y diferentes versiones de comstackdores).

Encabezado “push”

 #if defined(__clang__) # pragma clang diagnostic push #endif #if defined(_MSC_VER) # pragma warning(push) #endif #if defined(YOUR_FAVORITE_COMPILER) # pragma your compiler push warning #endif 

Encabezado “pop”

 #if defined(__clang__) # pragma clang diagnostic pop #endif #if defined(_MSC_VER) # pragma warning(pop) #endif 

Alguna advertencia

 #if defined(__clang__) # pragma clang diagnostic ignored "-Wunused-parameter" # pragma clang diagnostic ignored "-Wunused-variable" # if __has_warning("-Wnew-special-warning") # pragma clang diagnostic ignored "-Wnew-special-warning" # endif #endif #if defined(_MSC_VER) # pragma warning(disable: 4100) // unreferenced formal parameter # if _MSC_VER > _MSC_SOME_VERSION # pragma warning(disable: xxxx) // disable one more for special version # endif #endif 

Uso

 // This code reports warnings // ... #include  #include  #include  #include  // This code ignores warnings type_{1,2,3} // ... #include  // Back to reporting warnings // ... 

Además, los guardias pueden verificar que no haya pragmas de doble push / pop / disable-warning.

Actualizar

  • Implementación
  • Lista de advertencias disponibles
  • Función compañera de CMake para generar banderas

Demasiado tarde para sharptooth pero para todos los googlers que hay:

 #pragma warning ( suppress: ThatWarning ) // one single line with ThatWarning 

es la abreviatura de (generalmente desde VS 2008 , pero en VS 2005 solo para advertencias de Code Analyzer):

 #pragma warning ( push ) #pragma warning ( disable: ThatWarning ) // one single line with ThatWarning #pragma warning ( pop ) 

El enfoque correcto (aunque un poco feo)

 #ifdef _MSC_VER #pragma warning( push ) #pragma warning( once: ThatWarning ) #endif //code with ThatWarning here #ifdef _MSC_VER #pragma warning( pop ) #endif 

Puede desactivar advertencias específicas en las opciones de proyecto o archivo y esta configuración se aplica como ‘predeterminada’ según esos #pragmas en el scope relevante. Algunas de las advertencias en VS2005 son tan inútiles / molestas que esto limpia un poco la salida, si se usa /W4 .

Esto se encuentra en Propiedades en Propiedades de configuración -> C / C ++ -> Avanzado.

No tengo problemas con la primera variante. Puede ser la mejor manera es usar lo siguiente:

  #pragma warning( push ) #pragma warning( once: ThatWarning ) //code with ThatWarning here #pragma warning( pop ) 

Esto le permitirá saber que todavía hay advertencias en el código, pero los mensajes de advertencia no serán tan molestos. Pero esa es la cuestión del gusto.