¿Por qué convertir valores de retorno no utilizados en void?


int fn();

void whatever()
{
    (void) fn();
}

¿Hay alguna razón para lanzar un valor de retorno no utilizado a void, 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 de auto-documentación es mejor que los comentarios. Personalmente, apagaré estas advertencias ya que es ruido innecesario.

Me comeré mis palabras si un insecto se escapa por ello...

 99

8 answers

La respuesta de David prácticamente cubre la motivación para esto, para mostrar explícitamente a otros "desarrolladores" que sabes que esta función devuelve pero que la estás ignorando explícitamente.

Esta es una forma de asegurar que siempre se manejen códigos de error cuando sea necesario.

Creo que para C++ este es probablemente el único lugar en el que prefiero usar moldes de estilo C también, ya que usar la notación de fundición estática completa se siente como exageración aquí. Finalmente, si está revisando un estándar de codificación o escribiendo uno, entonces también es una buena idea declarar explícitamente que las llamadas a operadores sobrecargados (no usando notación de llamadas a funciones) también deberían estar exentas de esto:

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.
 67
Author: Richard Corden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:55

En el trabajo usamos eso para reconocer que la función tiene un valor de retorno, pero el desarrollador ha afirmado que es seguro ignorarlo. Ya que etiquetaste la pregunta como C++ deberías usar static_cast :

static_cast<void>(fn());

En lo que respecta al compilador, lanzar el valor devuelto a void tiene poco significado.

 38
Author: David Holm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 13:03:49

La verdadera razón para hacer esto se remonta a una herramienta utilizada en el código C, llamada lint.

Analiza el código buscando posibles problemas y emitiendo advertencias y sugerencias. Si una función devuelve un valor que luego no se comprueba, lint avisará en caso de que esto sea accidental. Para silenciar lint en esta advertencia, lanzas la llamada a (void).

 32
Author: Daniel Earwicker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 13:13:13

La conversión a void se usa para suprimir las advertencias del compilador para variables no utilizadas y valores o expresiones de retorno no guardados.

La Norma (2003) dice en §5.2.9 / 4 dice,

Cualquier expresión se puede convertir explícitamente al tipo "cv void."El valor de la expresión es descartado.

Así que puedes escribir:

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

Todas las formas son válidas. Normalmente lo hago más corto como:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

También está bien.

 20
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 07:07:45

Para la funcionalidad de su programa casting a void no tiene sentido. También argumentaría que no debe usarlo para señalar algo a la persona que está leyendo el código, como se sugiere en la respuesta de David. Si quieres comunicar algo sobre tus intenciones, es mejor usar un comentario. Agregar un molde como este solo se verá extraño y planteará preguntas sobre la posible razón. Sólo mi opinión...

 5
Author: Dani van der Meer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 13:16:41

Lanzar al vacío es sin costo. Es solo información para el compilador cómo tratarlo.

 3
Author: klew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-27 13:05:18

En Do, está perfectamente bien lanzar al vacío. Prácticamente cualquiera entenderá la intención de la declaración.

En C++, tiene otras herramientas a su disposición. Dado que los moldes de C generalmente están mal vistos, y dado que el molde explícito a void probablemente sorprenderá a sus compañeros de trabajo (sorprende a los míos), tengo esta plantilla de función en algún lugar

template <typename T>
void use_expression(const T&) {}

Y yo uso

...
use_expression(foo());

Donde escribiría (void)foo() en C.

 3
Author: Alexandre C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-24 08:00:26

Además, al verificar que su código cumple con MISTA (u otros) estándares, 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 envíe explícitamente el valor devuelto a (void)

 1
Author: Versatile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-20 20:59:25