¿Exit () hace algo especial que 'return' no?
Con algunos compiladores para plataformas poco comunes, exit()
podría traducir su argumento al valor de salida de su programa, mientras que un retorno de main()
podría simplemente pasar el valor directamente al entorno host sin ninguna traducción.
El estándar requiere un comportamiento idéntico en estos casos (específicamente, dice que devolver algo que sea int
compatible main()
debería ser equivalente a llamar exit()
con ese valor). El problema es que diferentes sistemas operativos tienen diferentes convenciones para interpretar los valores de salida. En muchos sistemas (¡MUCHOS!), 0 significa éxito y cualquier otra cosa es un fracaso. Pero en, por ejemplo, VMS, los valores impares significan éxito y los pares significan fracaso. Si devolvió 0 desde main()
, un usuario de VMS vería un mensaje desagradable sobre una infracción de acceso. En realidad no hubo una infracción de acceso, ese fue simplemente el mensaje estándar asociado con el código de falla 0.
Luego, ANSI apareció y fue bendecido EXIT_SUCCESS
y EXIT_FAILURE
como argumentos a los que podrías pasar exit()
. La norma también dice que exit(0)
debe comportarse de forma idéntica a exit(EXIT_SUCCESS)
, por lo que la mayoría de las implementaciones definen EXIT_SUCCESS
a 0
.
El estándar, por lo tanto, lo pone en un enlace en VMS, ya que no deja una forma estándar de devolver un código de falla que tiene el valor 0.
El compilador VAX / VMS C de principios de la década de 1990, por lo tanto, no interpretó el valor de retorno main()
, simplemente devolvió cualquier valor al entorno host. Pero si lo usara exit()
, haría lo que el estándar requería: traducir EXIT_SUCCESS
(o 0
) en un código de éxito y EXIT_FAILURE
en un código de falla genérico. Para usarlo EXIT_SUCCESS
, tenía que pasárselo exit()
, no podía devolverlo main()
. No sé si las versiones más modernas de ese compilador conservaron ese comportamiento.
Un programa C portátil solía verse así:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
Aparte: si recuerdo correctamente, la convención VMS para valores de salida tiene más matices que impar / par. En realidad, usa algo como los tres bits bajos para codificar un nivel de gravedad. En términos generales, sin embargo, los niveles de gravedad impares indicaron éxito o información variada y los pares indicaron errores.