Tengo una aplicación multiplataforma y en algunas de mis funciones no se utilizan todos los valores pasados a las funciones. Por lo tanto, recibo una advertencia de GCC que me dice que hay variables no utilizadas.
¿Cuál sería la mejor forma de codificar la advertencia?
¿Un #ifdef alrededor de la función?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Esto es tan feo pero parece la forma en que el compilador preferiría.
¿O asigno cero a la variable al final de la función? (lo cual odio porque está alterando algo en el flujo del programa para silenciar una advertencia del compilador).
¿Hay una manera correcta?
c++
gcc
warnings
gcc-warning
Phil Hannent
fuente
fuente
Q_UNUSED
macro solo para esto. Compruébalo en la documentación.Respuestas:
Puede ponerlo en "
(void)var;
" expresión (no hace nada) para que un compilador vea que se usa. Esto es portátil entre compiladores.P.ej
O,
fuente
Q_UNUSED
se implementa en principio.#define UNUSED(expr) (void)(expr)
debería funcionar también (sin el do-while).template<typename... Args> void f(const Args&... args)
No puedo escribir(void)args;
o(void)args...;
porque ambos son errores de sintaxis.En GCC y Clang puedes usar la
__attribute__((unused))
directiva de preprocesador para lograr tu objetivo.Por ejemplo:
fuente
C ++ 17 ahora proporciona el
[[maybe_unused]]
atributo.http://en.cppreference.com/w/cpp/language/attributes
Bastante agradable y estándar.
fuente
Su solución actual es la mejor: comente el nombre del parámetro si no lo usa. Eso se aplica a todos los compiladores, por lo que no tiene que usar el preprocesador para hacerlo especialmente para GCC.
fuente
g++
hay una advertencia al respecto). En tal caso, ¿qué recomendaría?Actualización de C ++ 17
En C ++ 17 obtenemos el atributo [[maybe_unused]] que está cubierto en [dcl.attr.unused]
Para el siguiente ejemplo:
Tanto clang como gcc generan un diagnóstico usando -Wall -Wextra para bar y unused_bool ( Véalo en vivo ).
Al agregar [[maybe_unused]] silencia los diagnósticos:
ver en vivo .
Antes de C ++ 17
En C ++ 11, se
UNUSED
podría formar una forma alternativa de la macro utilizando una expresión lambda (a través de Ben Deane ) con una captura de la variable no utilizada:La invocación inmediata de la expresión lambda debe optimizarse, dado el siguiente ejemplo:
Podemos ver en Godbolt que la llamada está optimizada:
fuente
template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }
También podría usar un lambda en la función, supongo.[&x]{}()
en realidad no silencia la advertencia, sino que pasa la advertencia de la función de llamada a la lambda. Tomará tiempo hasta que los compiladores identifiquen esto como una advertencia, pero clang-tidy ya se queja de una variable no utilizada en la lista de captura.Una forma aún más limpia es comentar los nombres de las variables:
fuente
#if 0 / #endif
comentarios de bloque.Un compañero de trabajo me acaba de señalar esta pequeña macro agradable aquí
Para facilitar, incluiré la macro a continuación.
fuente
gccno marca estas advertencias por defecto. Esta advertencia debe haberse activado explícitamente pasando
-Wunused-parameter
al compilador o implícitamente pasando-Wall -Wextra
(o posiblemente alguna otra combinación de banderas).Las advertencias de parámetros no utilizadas pueden simplemente suprimirse pasando
-Wno-unused-parameter
al compilador, pero tenga en cuenta que este indicador de desactivación debe aparecer después de cualquier posible indicador de habilitación para esta advertencia en la línea de comandos del compilador, para que surta efecto.fuente
forma portátil y sin macro para declarar uno o más parámetros como no utilizados:
fuente
El uso de directivas de preprocesador se considera malvado la mayor parte del tiempo. Lo ideal es evitarlos como la plaga. Recuerde que hacer que el compilador comprenda su código es fácil, lo que permite que otros programadores comprendan su código es mucho más difícil. Algunas docenas de casos como este aquí y allá hacen que sea muy difícil leerlo para usted más tarde o para otros en este momento.
Una forma podría ser poner sus parámetros juntos en algún tipo de clase de argumento. Entonces podría usar solo un subconjunto de las variables (equivalente a su asignación de 0 realmente) o tener diferentes especializaciones de esa clase de argumento para cada plataforma. Sin embargo, esto podría no valer la pena, debe analizar si encajaría.
Si puede leer plantillas imposibles, puede encontrar consejos avanzados en el libro "Excepcional C ++". Si las personas que leen su código pueden obtener su conjunto de habilidades para abarcar las cosas locas que se enseñan en ese libro, entonces tendría un código hermoso que también se puede leer fácilmente. El compilador también estaría al tanto de lo que está haciendo (en lugar de ocultar todo preprocesando)
fuente
#define UNUSED(expr) (void)(expr)
apropiado.Primero, la advertencia es generada por la definición de variable en el archivo fuente, no en el archivo de encabezado. El encabezado puede permanecer impecable y debería, ya que podría estar usando algo como doxygen para generar la documentación API.
Asumiré que tiene una implementación completamente diferente en los archivos fuente. En estos casos, puede comentar el parámetro ofensivo o simplemente escribir el parámetro.
Ejemplo:
Esto puede parecer críptico, por lo que define una macro como NO UTILIZADA. La forma en que MFC lo hizo es:
De este modo, verá que la advertencia aún en las versiones de depuración puede ser útil.
fuente
¿No es seguro comentar siempre los nombres de los parámetros? Si no es así, puedes hacer algo como
Es un poco menos feo.
fuente
He visto esto en lugar
(void)param2
de silenciar la advertencia:Parece que esto se agregó en C ++ 11
fuente
Usar un
UNREFERENCED_PARAMETER(p)
podría funcionar. Sé que está definido en WinNT.h para sistemas Windows y también se puede definir fácilmente para gcc (si aún no lo tiene).UNREFERENCED PARAMETER(p)
Se define comoen WinNT.h.
fuente
Use la bandera del compilador, por ejemplo, bandera para GCC:
-Wno-unused-variable
fuente
Puede usar
__unused
para decirle al compilador que la variable podría no usarse.fuente
__unused
no es C ++ estándar, y más concretamente, tampoco lo que publicaste ... Eso es Objective-C. Por lo tanto, esta respuesta solo es realmente útil para compiladores específicos, y hace que el código no sea portátil y, de hecho, no sea realmente válido, ya que el código de usuario no está destinado a usar identificadores__
, que están reservados para la implementación.En C ++ 11, esta es la solución que estoy usando:
Verificado como portátil (al menos en msvc, clang y gcc modernos) y que no produce código adicional cuando las optimizaciones están habilitadas. Sin optimización, la llamada de función adicional se realiza y las referencias a los parámetros se copian en la pila, pero no hay macros involucradas.
Si el código adicional es un problema, puede usar esta declaración en su lugar:
pero en ese punto, una macro proporciona una mejor legibilidad:
fuente
Esto funciona bien pero requiere C ++ 11
fuente
ALLCAPS
para cualquier cosa que no sea macros, que es hacer que se vean feos e indeseables, pero no hay nada malo en esto, realmente, excepto que astatic_cast
sería mejor.Encontré que la mayoría de las respuestas presentadas funcionan solo para la variable local no utilizada y causarán un error de compilación para la variable global estática no utilizada.
Otra macro necesaria para suprimir la advertencia de variable global estática no utilizada.
Esto funciona porque no se informará ninguna advertencia para la variable global no estática en el espacio de nombres anónimo.
Sin embargo, se requiere C ++ 11
fuente
Jajaja ¡No creo que haya otra pregunta sobre SO que revele todos los herejes corrompidos por el Caos mejor que este!
Con el debido respeto a C ++ 17, hay una directriz clara en las Pautas principales de C ++ . AFAIR, en 2009, esta opción estaba disponible tanto como hoy. Y si alguien dice que se considera un error en Doxygen, entonces hay un error en Doxygen
fuente
No veo tu problema con la advertencia. Documente en el encabezado de método / función que el compilador xy emitirá una advertencia (correcta) aquí, pero que estas variables son necesarias para la plataforma z.
La advertencia es correcta, no es necesario apagarla. No invalida el programa, pero debe documentarse que hay una razón.
fuente