¿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
clangno 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:4101en su lugar.Si solo desea suprimir una advertencia en una sola línea de código, puede usar el
suppressespecificador de advertencia :Para una sola línea de código, esto funciona igual que escribir lo siguiente:
fuente
suppressespecificador opera en una única línea de código preprocesada . Si la línea siguiente#pragma warning(suppress: ...)es una#includedirectiva (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.#pragmapush / 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 quedisableyenable: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_PARAMETERdefinido 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_PARAMETERlo mismo queUNREFERENCED_PARAMETERen las compilaciones de depuración yP=Pen la compilación de lanzamiento.fuente
[[maybe_unused]]atributoSi desea deshabilitar la
unreferenced local variableescritura 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 discardedsegú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
decltypedeclaración, el compilador se queja pero debe tener la variable nombradae.Todas las no
#pragmasugerencias 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