c++ - usar - ¿Por qué arrojar los valores de devolución no utilizados a vacío?
que es return en programacion (8)
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 devolución sin tener que devolver un valor a menos que exprese explícitamente el valor devuelto como (vacío)
int fn();
void whatever()
{
(void) fn();
}
¿Hay alguna razón para emitir un valor de retorno no utilizado para anular, o estoy en lo cierto al pensar que es una completa pérdida de tiempo?
Seguir:
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, desactivaré estas advertencias ya que es un ruido innecesario.
Voy a comer mis palabras si un error escapa por eso ...
Cast al vacío no tiene costo. Es solo información para el compilador cómo tratarlo.
Casting to void
se utiliza para suprimir las advertencias del compilador de las variables no utilizadas y las expresiones o valores de retorno no guardados.
El estándar (2003) dice en §5.2.9 / 4 dice,
Cualquier expresión se puede convertir explícitamente para escribir "cv void". El valor de la expresión se descarta .
Entonces 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());
Todos los formularios son validos Normalmente lo hago más corto como:
//suppressing expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);
También está bien.
En C, está perfectamente bien lanzar al vacío. Prácticamente cualquiera entenderá la intención de la declaración.
En C ++, tienes otras herramientas a tu disposición. Dado que los cassettes C usualmente son mal vistos, y dado que el lanzamiento explícito al vacío probablemente sorprenderá a tus compañeros de trabajo (sorprende al mío), tengo esta plantilla de función en alguna parte
template <typename T>
void use_expression(const T&) {}
y yo uso
...
use_expression(foo());
donde escribiría (void)foo()
en C.
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. Como etiquetó la pregunta como C ++, debe usar static_cast :
static_cast<void>(fn());
En cuanto al compilador va a emitir el valor de retorno a vacío, tiene poco significado.
La answer de David prácticamente cubre la motivación para esto, para mostrar explícitamente a otros "desarrolladores" que usted sabe que esta función regresa, pero que está ignorándola explícitamente.
Esta es una forma de garantizar que siempre que se necesiten códigos de error siempre se manejen.
Creo que para C ++ este es probablemente el único lugar en el que prefiero usar los moldes de estilo C también, ya que usar la notación de lanzamiento completamente estático simplemente parece exagerado aquí. Finalmente, si está revisando un estándar de codificación o escribiendo uno, también es una buena idea declarar explícitamente que las llamadas a operadores sobrecargados (que no utilizan la notación de llamada a función) deberían estar exentas de esto también:
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.
La verdadera razón para hacer esto data de 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 devolvía un valor que no se verificaba, la lint
advertiría en caso de que fuera accidental. Para silenciar la lint
en esta advertencia, transfiere la llamada a (void)
.
Para la funcionalidad de tu programa de conversión a vacío no tiene sentido. También argumentaría que no debes usarlo para señalar algo a la persona que está leyendo el código, como se sugiere en la respuesta de David. Si desea comunicar algo acerca de sus intenciones, es mejor usar un comentario. Agregar un molde como este solo se verá extraño y hará preguntas sobre la posible razón. Solo es mi opinión...