Pregunta Deshabilitar error de advertencia único


¿Hay alguna manera de desactivar una sola línea de advertencia en un archivo cpp con Visual Studio?

Por ejemplo, si capturo una excepción y no la manejo, obtengo el error 4101 (variable local sin referencia). ¿Hay alguna manera de ignorar esto solo en esa función, pero de lo contrario informarlo en la unidad de compilación? Por el momento, puse #pragma warning (disable : 4101) en la parte superior del archivo, pero eso obviamente lo apaga para toda la unidad.


75
2017-08-23 10:06


origen


Respuestas:


#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

126
2017-08-23 10:09



Si solo quiere suprimir una advertencia en una sola línea de código, puede usar suppress  especificador de advertencia:

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

Para una sola línea de código, esto funciona igual que escribir lo siguiente:

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

53
2017-08-22 13:06



#pragma push / pop suele ser una solución para este tipo de problemas, pero en este caso, ¿por qué no elimina la variable sin referencia?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

23
2017-08-23 10:11



Utilizar #pragma warning ( push ), entonces #pragma warning ( disable ), luego pon tu código, luego usa #pragma warning ( pop ) como se describe aquí:

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

9
2017-08-23 10:10



En lugar de ponerlo encima del archivo (o incluso un archivo de encabezado), simplemente envuelva el código en cuestión con #pragma warning (push), #pragma warning (disable) y un juego #pragma warning (pop), como se muestra aquí.

Aunque hay algunas otras opciones, incluyendo #pramga warning (once).


4
2017-08-23 10:08



Uno también puede usar UNREFERENCED_PARAMETER definido en WinNT.H. La definición es justa:

#define UNREFERENCED_PARAMETER(P)          (P)

Y úsalo como:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

¿Por qué lo usarías, podrías argumentar que puedes omitir el nombre de la variable en sí mismo? Bueno, hay casos (configuración de proyecto diferente, compilaciones de Depuración / Versión) donde la variable realmente podría ser utilizada. En otra configuración, esa variable permanece sin usar (y de ahí la advertencia).

Algunos análisis de código estático aún pueden dar advertencia para esta afirmación no absurda (wParam;) En ese caso, puedes usar DBG_UNREFERENCED_PARAMETER que es lo mismo que UNREFERENCED_PARAMETER en compilaciones de depuración, y lo hace P=P en la versión de lanzamiento.

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

4
2017-08-23 14:56



En ciertas situaciones, debe tiene un parámetro con nombre pero no lo usa directamente.
Por ejemplo, me encontré con él en VS2010, cuando 'e' se usa solo dentro de un decltype declaración, el compilador se queja pero debe tener el varible nombrado e.

Todas las anteriores no#pragma todas las sugerencias se reducen a solo agregar una sola declaración:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

2
2017-08-07 08:58



Si quieres deshabilitar unreferenced local variable escribir en un encabezado

template<class T>
void ignore (const T & ) {}

y use

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

1
2017-08-23 10:22



Ejemplo:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

Este pragma es válido para C ++ comenzando con Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

El pragma NO es válido para DO# a través de Visual Studio 2005 a través de Visual Studio 2015.
Error: "Deshabilitar o restaurar esperado".
(Supongo que nunca llegaron a implementar suppress ...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C # necesita un formato diferente. Se vería así (pero no funciona):

#pragma warning suppress 0642  // (suppress one error in the next line)

En lugar de suppress, tienes que disable y enable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

Eso es TAN feo, creo que es más inteligente simplemente re-estilo:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

1
2018-06-26 04:36