2011-08-23 15 views
66

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

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, pongo #pragma warning (disable : 4101) en la parte superior del archivo, pero eso obviamente lo apaga para toda la unidad.

+14

si menciona solo el tipo y no menciona la excepción, no habrá advertencia. P.ej. 'catch (const std :: exception &/* * unnamed * /) {....}'. No responde su pregunta, pero podría resolver su problema. – Sjoerd

Respuesta

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

Supongo que esto funciona para incluye también? – Cookie

+0

@Cookie: sí, funciona para cualquier fragmento de código que pase por el compilador. –

+0

Para obtener una respuesta más reciente y concisa, consulte la respuesta de Daniel Seither, a continuación. –

4

en vez de ponerlo en la parte superior del archivo (o incluso un archivo de cabecera), simplemente envolver el código en cuestión con #pragma warning (push), #pragma warning (disable) y un juego #pragma warning (pop), como se muestra here.

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

9

Uso #pragma warning (push), entonces #pragma warning (disable), a continuación, poner el código, a continuación, utilizar #pragma warning (pop) como se describe here:

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

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

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

Esto no es una respuesta a la pregunta. De acuerdo, esto podría resolver el problema de OP, pero no ayudará a los futuros lectores con una pregunta similar: "¿cómo desactivo una advertencia específica para una parte específica de mi código?" – Sjoerd

+0

@Sjoerd: tres personas ya respondieron la" pregunta oficial "que otras personas pueden buscar, así que en su lugar traté de leer entre líneas y resolver su problema real (llegando un minuto después de tu comentario': P'). –

+6

@Sjoerd como lector futuro, certifico que esta respuesta, de hecho, me ayudó. –

1

Si desea desactivar unreferenced local variable escritura de alguna cabecera

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

y utilizar

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

¿Una llamada de función, solo para suprimir la advertencia? ¿Por qué no lo hace? esto en cambio: '(void) unusedVar;'? – Nawaz

+0

@Nawaz: Creo que '(void) unusedVar;?' no cumple con C++. –

+0

¿Quién dijo? ¿Alguna referencia? – Nawaz

4

También se puede utilizar UNREFERENCED_PARAMETER definido en WinNT.H. La definición es:

#define UNREFERENCED_PARAMETER(P)   (P) 

y utilizarlo como:

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

¿Por qué usarlo, se podría argumentar que sólo puede omitir el mismo nombre de variable. 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 todavía pueden dar advertencia para esta declaración sin sentido (wParam;). En ese caso, puede usar DBG_UNREFERENCED_PARAMETER que es lo mismo que UNREFERENCED_PARAMETER en compilaciones de depuración y P=P en compilación de versión.

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

En determinadas situaciones, es debe tener un parámetro llamado pero no utilizarla directamente.
Por ejemplo, me encontré con él en VS2010, cuando 'e' se usa solo dentro de una declaración decltype, el compilador se queja pero debe tener el varible variado e.

todo lo anterior no #pragma sugerencias todas se reducen a sólo añadir una sola instrucción:

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

ahora (en el compilador MS VS2015) esto causa C4702 código inalcanzable – dlatikay

43

Si sólo desea suprimir una advertencia en una sola línea de código, se puede utilizar el suppresswarning specifier:

#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 lo mismo que escribir lo siguiente:

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

¡Muy útil! Lamentablemente, no funciona para una sola línea que incluye un encabezado que genera la advertencia. –

+1

@MarkoPopovic: el especificador 'suprimir' funciona en una única línea de código ** preprocesada **. Si la línea que sigue a '#pragma warning (suprimir: ...)' es una directiva '# include' (que expande el archivo al que hace referencia su parámetro en la unidad de compilación actual), el efecto solo se aplica a la primera línea de ese archivo . Esto debería ser obvio, ya que las advertencias son generadas por el compilador. El compilador opera con código preprocesado. – IInspectable

1

Ejemplo:

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

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

El pragma no es válida para C# a través de Visual Studio 2005 a través de Visual Studio 2015
Error: "Deshabilitar o restaurar esperado".
(supongo que nunca llegó a la implementación de suppress ...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

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

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

En lugar de suppress, usted tiene 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 

que es tan feo, creo que es más inteligente que acaba de volver style it:

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