Necesidad de prefijar una función con (void)

3 minutos de lectura

Recientemente me encontré con una convención de codificación bastante inusual en la que la llamada a una función que devuelve “vacío” tiene el prefijo (vacío).

p.ej

(void) MyFunction();  

¿Es diferente de la llamada a la función como:

MyFunction();  

¿Tiene alguna ventaja o es otra convención de codificación innecesaria pero de algún tipo?

Algunas funciones como printf() devuelven un valor que casi nunca se usa en el código real (en el caso de printf, la cantidad de caracteres impresos). Sin embargo, algunas herramientas, como hilasespere que si una función devuelve un valor, debe usarse y se quejará a menos que escriba algo como:

int n = printf( "hello" );

usando el molde vacío:

(void) printf( "hello" );

es una forma de decirle a esas herramientas que realmente no desea utilizar el valor de retorno, manteniéndolas así en silencio. Si no usa tales herramientas, no necesita molestarse y, en cualquier caso, la mayoría de las herramientas le permiten configurarlas para ignorar los valores de retorno de funciones específicas.

  • Veo. Pero entonces, ¿por qué alguien querría hacer esto para una función que ya regresa vacía?

    – llamado de vibora

    14 de junio de 2010 a las 8:54

  • Claro, pero dijo que el elenco estaba hecho para funciones que regresan vacías.

    – Artefacto

    14 de junio de 2010 a las 8:54

  • @puffadder Supongo que el tipo de retorno de la función cambió en algún momento, pero el código de llamada no.

    luego

    14 de junio de 2010 a las 8:57

No, no hay ninguna diferencia: lo que se anula es el valor de retorno de la función.

Diría que podría tener sentido si quisiera hacer explícito que no está usando el valor de retorno (lo está llamando por los efectos secundarios), pero como la función ya tiene retorno nulo, no tiene mucho sentido .

Si la función devuelve algo, el vacío podría evitar (!) una advertencia (de hecho, de ninguna manera pude hacer que gcc me advirtiera que el valor de retorno se perdió) en algunos compiladores (o herramientas de pelusa); pero lo que es más importante, deja en claro que un valor devuelto se “desperdicia” a propósito (y no por error).

académicamente: una “función” siempre devuelve algo, de lo contrario sería un procedimiento. Entonces, el autor de este código quiere decir “Sé que este nombre es incorrecto, pero no cambiaré el nombre, así que hago visible esta perturbación”.

¿Tiene alguna ventaja o es otra convención de codificación innecesaria pero de algún tipo?

Ninguna diferencia. Es una convención bastante común, por ejemplo, en las pruebas de software, resaltar el hecho de que, en contexto, es seguro descartar la devolución de la función, si la hay.

Necesidad de prefijar una funcion con void
jim mcnamara

En las páginas de manual de HPUX, es bastante común en el código de ejemplo ver una conversión a vacío para sortear las advertencias de pelusa.

fprintf(mystream, "%s\n", "foo");

contra

(void)fprintf(mystream, "%s\n", "foo");

De ahí puede provenir el autor del código. En mi opinión, esta no es una gran idea porque la mayoría de la familia sprintf, por ejemplo, llama a malloc. malloc fallará cuando no haya suficiente memoria. SIGINT también hace que la llamada al sistema write() subyacente interrumpa y no escriba todo el búfer, para los miembros de la familia printf().

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad