Contamos con la solución a esta preocupación, al menos eso esperamos. Si sigues con preguntas puedes escribirlo en el apartado de preguntas, que sin dudar
Solución:
En C++, dicho código tiene un comportamiento indefinido:
[stmt.return]/2 … Salir del final de una función es equivalente a un retorno sin valor; esto da como resultado un comportamiento indefinido en una función de retorno de valor. …
La mayoría de los compiladores generarán una advertencia para el código similar a la de la pregunta.
El estándar C++ no requiere que esto sea un error de tiempo de compilación porque, en general, sería muy difícil determinar correctamente si el código realmente se ejecuta al final de la función, o si la función sale a través de una excepción (o un longjmp). o mecanismo similar).
Considerar
int func3()
func4();
Si func4()
lanza, entonces este código está totalmente bien. Es posible que el compilador no pueda ver la definición de func4()
(debido a la compilación separada), por lo que no puede saber si se lanzará o no.
Además, incluso si el compilador puede probar que func4()
no tira, todavía tendría que probar que func3()
recibe una llamada antes de que pueda rechazar legítimamente el programa. Dicho análisis requiere la inspección de todo el programa, lo que es incompatible con la compilación por separado, y que ni siquiera es posible en el caso general.
En C, citando N1256 6.9.1p12:
Si el } que finaliza una función, y el autor de la llamada utiliza el valor de la llamada de función, el comportamiento no está definido.
Así que es legal (pero una mala idea) para un no-void función para no devolver un valor, pero si lo hace y la persona que llama intenta utilizar el resultado, el comportamiento no está definido. Tenga en cuenta que no necesariamente solo devuelve un valor arbitrario; en lo que respecta al estándar, todo es posible.
Pre-ANSI C no tenía la void
palabra clave, por lo que la forma de escribir una función que no devolviera un valor era omitir el tipo de retorno, haciendo que devolviera implícitamente int
. Requerir un return
declaración en una función de retorno de valor habría roto el código antiguo. También habría requerido un análisis adicional por parte del compilador para determinar que todos las rutas de código golpean un return
declaración; dicho análisis es razonable para los compiladores modernos, pero podría haber sido una carga excesiva cuando se estandarizó C por primera vez.
C++ es un poco más estricto. En C++:
Salir del final de una función es equivalente a un devolver sin valor; esto da como resultado un comportamiento indefinido en una función de retorno de valor.
por lo tanto, el comportamiento no está definido si la persona que llama intenta usar el resultado (inexistente) o no.
Los compiladores de C y C++ ciertamente pueden advertir sobre la falta return
declaraciones, o sobre rutas de control que caen al final de una función sin ejecutar un return
declaración, pero las normas respectivas no les obligan a hacerlo.
En C, en realidad es legal para un no-void función para terminar sin devolver un valor, siempre que el código de llamada no intente usar el valor de retorno.
Por otro lado un return
declaración sin una expresión no puede aparecer en un no-void función.
Las partes relevantes del estándar C99 son §6.9.1 para el primer caso:
Si el
}
que finaliza una función, y el autor de la llamada utiliza el valor de la llamada de función, el comportamiento no está definido.
y §6.8.6.4 para el segundo caso:
A
return
declaración sin una expresión sólo aparecerá en una función cuyo tipo de retorno esvoid
.
Si posees algún recelo o disposición de aclararse nuestro escrito eres capaz de ejecutar una reseña y con placer lo observaremos.