Volver de una función void [cerrada]


Que es la forma más correcta de volver de la función:

void function() {
  // blah some code
}

O

void function() {
  // blah some code
  return;
}

Justificación para la segunda vía:

  1. Expresa las intenciones del desarrollador más claramente.
  2. Ayuda a detectar el final de la función en tiempo de pre-compilación:

Supongamos que tiene tal escenario - tiene un montón de funciones y debe inyectar algún código al final de esas funciones. Pero por algunas razones usted no quiere / o no puede modificar tal cantidad enorme de funciones. Lo que puede ¿lo haces al respecto ? Return & macro entra en juego, por ejemplo:

#include<stdio.h>

#define MAX_LINES 1000
#define XCAT(a,b) a##b
#define CAT(a,b) XCAT(a,b)
#define return returns[__LINE__] = 1;\
        if (returns[__LINE__])\
           {printf("End of function on %d line.\n",__LINE__);}\
        int CAT(tmp,__LINE__); \
        if ((CAT(tmp,__LINE__)=returns[__LINE__], returns[__LINE__] = 0, CAT(tmp,__LINE__)))\
              return

static int returns[MAX_LINES];


void function1(void) {
    return;
}

void function2(void) {
    return;
}

int main()
{
    function1();
    function2();

    return 0;
}
Author: Agnius Vasiliauskas, 2012-01-25

4 answers

Ninguno es más correcto, así que elige. La instrucción empty return; se proporciona para permitir que return en una función void desde un lugar distinto al final. No hay otra razón por la que crea.

 52
Author: William Morris,
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-08-13 07:59:37

La única razón para tener un retorno en una función void sería salir temprano debido a alguna instrucción condicional...

void foo(int y)
{
    if(y == 0) return;

    // do stuff with y
}

Como dijo unwind, cuando el código termina, termina. No hay necesidad de un retorno explícito al final.

 52
Author: Tevo D,
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
2012-01-25 14:06:19

La primera forma es "más correcta", ¿qué intención podría haber para expresar? Si el código termina, termina. Eso está bastante claro, en mi opinión.

No entiendo lo que podría ser confuso y necesitar aclaración. Si no hay construcción de bucle que se utiliza, entonces lo que podría suceder que no sea que la función deja de ejecutarse?

Me molestaría mucho una declaración adicional return tan inútil al final de una función void, ya que claramente no sirve propósito y solo me hace sentir que el programador original dijo " Yo estaba confundido acerca de esto, y ahora usted puede ser demasiado!"lo cual no es muy agradable.

 22
Author: unwind,
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
2014-10-03 14:45:45

Una vieja pregunta, pero voy a responder de todos modos. La respuesta a la pregunta real es que el retorno desnudo es redundante y debe omitirse.

Además, el valor sugerido es falso por la siguiente razón:

if (ret<0) return;

Redefinir una palabra reservada C como macro es una mala idea a primera vista, pero esta sugerencia en particular es simplemente insostenible, tanto como argumento como como código.

 1
Author: don provan,
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-09-03 17:11:15