int fn();
void whatever()
{
(void) fn();
}
¿Hay alguna razón para anular un valor de retorno no utilizado, o tengo razón al pensar que es una completa pérdida de tiempo?
Seguimiento:
Bueno, eso parece bastante completo. Supongo que es mejor que comentar un valor de retorno no utilizado ya que el código autodocumentado es mejor que los comentarios. Personalmente, desactivaré estas advertencias ya que es un ruido innecesario.
Me comeré mis palabras si un bicho se me escapa por eso ...
En el trabajo, lo usamos para reconocer que la función tiene un valor de retorno, pero el desarrollador ha afirmado que es seguro ignorarlo. Dado que etiquetó la pregunta como C ++, debería usar static_cast :
En lo que respecta al compilador, lanzar el valor de retorno a void tiene poco significado.
fuente
La verdadera razón para hacer esto se remonta a una herramienta utilizada en código C, llamada lint .
Analiza el código en busca de posibles problemas y emite advertencias y sugerencias. Si una función devolvía un valor que luego no se verificó,
lint
advertiría en caso de que esto fuera accidental. Para silenciarlint
esta advertencia, lanza el llamado a(void)
.fuente
La conversión a
void
se utiliza para suprimir las advertencias del compilador para variables no utilizadas y valores o expresiones de retorno no guardados.The Standard (2003) dice en §5.2.9 / 4 dice,
Entonces puedes escribir:
Todos los formularios son válidos. Normalmente lo hago más corto como:
También está bien.
fuente
Desde c ++ 17 tenemos el
[[maybe_unused]]
atributo que se puede usar en lugar delvoid
cast.fuente
nodiscard
que puede ser de interés: stackoverflow.com/a/61675726/895245 También creo que no se puede aplicar[[maybe_unused]]
directamente a la llamada que parece, solo a una variable ficticia que acepta la devolución de la llamada. Si eso es correcto, es un poco inestable.Lanzar al vacío no tiene costo. Es solo información para que el compilador lo trate.
fuente
(void)
me cuesta tiempo y energía y me hace preguntarme si el autor sabía cómo funcionan las expresiones.Para la funcionalidad de su programa, el casting para anular no tiene sentido. También diría que no debe usarlo para señalar algo a la persona que está leyendo el código, como sugiere David en la respuesta. Si desea comunicar algo sobre sus intenciones, es mejor utilizar un comentario. Agregar un elenco como este solo se verá extraño y generará preguntas sobre la posible razón. Solo es mi opinión...
fuente
For the functionality of you program casting to void is meaningless
Para la autodocumentación y la cantidad de advertencias al compilar, realmente no lo es.you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
El mejor comentario es no comentar , cuando el código se explica a sí mismo. Y, de nuevo, mantiene feliz a un compilador de advertencia válida en el proceso.Además, cuando verifique que su código cumpla con los estándares MISTA (u otros), las herramientas automáticas como LDRA no le permitirán llamar a una función que tenga un tipo de retorno sin que devuelva un valor a menos que exprese explícitamente el valor devuelto a (void)
fuente
C ++ 17
[[nodiscard]]
C ++ 17 estandarizó el "valor de retorno empresarial ignorado" con un atributo.
Por lo tanto, espero que las implementaciones compatibles siempre avisen solo cuando
nodiscard
se da, y nunca advierten lo contrario.Ejemplo:
main.cpp
compilar:
Salir:
Todos los siguientes evitan la advertencia:
No pude usar
maybe_unused
directamente en laf()
llamada:da:
El
(void)
trabajo de yeso no parece ser obligatorio, pero está "recomendado" en el estándar: ¿Cómo puedo descartar intencionalmente un valor de retorno [[nodiscard]]?También como se ve en el mensaje de advertencia, una "solución" a la advertencia es agregar
-Wno-unused-result
:aunque, por supuesto, no recomendaría ignorar las advertencias a nivel mundial como esta.
C ++ 20 también permite añadir una razón para la
nodiscard
que en[[nodiscard("reason")]]
como se mencionó en: https://en.cppreference.com/w/cpp/language/attributes/nodiscardwarn_unused_result
Atributo GCCAntes de la estandarización de
[[nodiscard]]
, y para C antes de que finalmente decida estandarizar los atributos, GCC implementó exactamente la misma funcionalidad conwarn_unused_result
:lo que da:
Cabe señalar, entonces, que dado que ANSI C no tiene un estándar para esto, ANSI C no especifica qué funciones de biblioteca estándar de C tienen el atributo o no y, por lo tanto, las implementaciones han tomado sus propias decisiones sobre qué se debe marcar o no con
warn_unuesd_result
, qué Por eso, en general, tendría que usar la(void)
conversión para ignorar los retornos de cualquier llamada a las funciones de biblioteca estándar para evitar completamente las advertencias en cualquier implementación.Probado en GCC 9.2.1, Ubuntu 19.10.
fuente