¿Hay alguna forma de deshabilitar una sola línea de advertencia en un archivo cpp con Visual Studio?
Por ejemplo, si detecto 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, lo coloco #pragma warning (disable : 4101)
en la parte superior del archivo, pero eso obviamente lo apaga para toda la unidad.
c++
visual-c++
warnings
pragma
Galleta
fuente
fuente
catch (const std::exception& /* unnamed */) {.... }
. No responde a su pregunta, pero podría resolver su problema.Respuestas:
fuente
clang
no parece apoyar esta pragma, pero se puede lograr el mismo efecto con#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
y#pragma clang diagnostic pop
. Consulte "Control de diagnósticos a través de los pragmas" en el Manual del usuario de Clang/wd4101
. Tenga en cuenta que no hay lo normal:
entre la bandera y el número, y no puede hacer una lista de números separados por comas. Para otros compiladores podría ser/nowarn:4101
en su lugar.Si solo desea suprimir una advertencia en una sola línea de código, puede usar el
suppress
especificador de advertencia :Para una sola línea de código, esto funciona igual que escribir lo siguiente:
fuente
suppress
especificador opera en una única línea de código preprocesada . Si la línea siguiente#pragma warning(suppress: ...)
es una#include
directiva (que expande el archivo al que hace referencia su parámetro en la unidad de compilación actual), el efecto se aplica a la primera línea de ese archivo solamente. Esto debería ser obvio, ya que el compilador genera las advertencias. El compilador funciona con código preprocesado.#pragma
push / pop son a menudo una solución para este tipo de problemas, pero en este caso, ¿por qué no elimina la variable sin referencia?fuente
:P
).Use
#pragma warning ( push )
, luego#pragma warning ( disable )
, luego ingrese su código, luego use#pragma warning ( pop )
como se describe aquí :fuente
Ejemplo:
Este pragma es válido para C ++ a partir de Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
El pragma NO es válido para C # hasta Visual Studio 2005 hasta Visual Studio 2015.
Error: "Deshabilitación o restauración esperada".
(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 funcionaría):
En lugar de
suppress
, tienes quedisable
yenable
:Eso es TAN feo, creo que es más inteligente simplemente rediseñarlo:
fuente
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 una coincidencia#pragma warning (pop)
, como se muestra aquí .Aunque hay algunas otras opciones, incluidas
#pramga warning (once)
.fuente
También se puede usar
UNREFERENCED_PARAMETER
definido enWinNT.H
. La definición es simplemente:Y utilícelo como:
Por qué lo usaría, podría argumentar que puede omitir el nombre de la variable en sí. Bueno, hay casos (configuración de proyecto diferente, compilaciones de depuración / lanzamiento) en los que la variable podría usarse realmente. En otra configuración, esa variable no se utiliza (y de ahí la advertencia).
Algunos análisis de código estático aún pueden dar una advertencia para esta declaración sin sentido (
wParam;
). En ese caso, puede usarDBG_UNREFERENCED_PARAMETER
lo mismo queUNREFERENCED_PARAMETER
en las compilaciones de depuración yP=P
en la compilación de lanzamiento.fuente
[[maybe_unused]]
atributoSi desea deshabilitar la
unreferenced local variable
escritura en algún encabezadoy use
fuente
(void)unusedVar;
?(void)unusedVar;?
no cumple con el estándar C ++.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
según el cual puede escribirstatic_cast<void>(unusedVar)
ystatic_cast<const void>(unusedVar)
ystatic_cast<volatile void>(unusedVar)
. Todos los formularios son válidos. Espero que aclare tu duda.En ciertas situaciones, debe tener un parámetro con nombre, pero no lo usa directamente.
Por ejemplo, me lo encontré en VS2010, cuando 'e' se usa solo dentro de una
decltype
declaración, el compilador se queja pero debe tener la variable nombradae
.Todas las no
#pragma
sugerencias anteriores se reducen a solo agregar una sola declaración:fuente
como mencionó @rampion, si está en clang gcc, las advertencias son por nombre, no por número, y deberá hacer lo siguiente:
esta información viene de aquí
fuente