c++ - method - ¿Por qué el valor de retorno predeterminado de main es 0 y no EXIT_SUCCESS?
void function c++ (9)
El estándar ISO 1998 c ++ especifica que no usar explícitamente una declaración de devolución en la página principal es equivalente a usar la return 0
. Pero, ¿qué sucede si una implementación tiene un código estándar diferente de "no error", por ejemplo -1
?
¿Por qué no usar la macro estándar EXIT_SUCCESS
que se reemplazaría por 0
o -1
o cualquier otro valor dependiendo de la implementación?
C ++ parece forzar la semántica del programa, que no es el papel de un lenguaje que solo debe describir cómo se comporta el programa. Además, la situación es diferente para el valor de retorno de "error": solo EXIT_FAILURE
es un indicador de terminación de "error" estándar, sin valor explícito, como "1" por ejemplo.
¿Cuáles son las razones de estas elecciones?
¡0 es el código de salida estándar (correcto) en todos los sistemas POSIX, y todos los sistemas que conozco! Creo que ha sido así desde que comenzó el tiempo (o al menos desde que lo hizo Unix ...) Así que es por esta razón que diría.
¿Qué sistema sabes que es diferente?
0 como el código de retorno para el éxito, y los enteros positivos como errores es el estándar en C y Unix. Se eligió este esquema porque normalmente a uno no le importa por qué un programa tuvo éxito , solo lo hizo. Por otro lado, hay muchas formas en que un programa puede fallar con un error, y uno está interesado en esta información. Por lo tanto, tiene sentido utilizar un valor escalar para el éxito y un rango de valores para el error. El uso de enteros positivos es una convención de C que ahorra memoria, ya que permiten que el código de error se defina como un int sin signo.
Al navegar por cstdlib
terminé con dos líneas:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
Entonces, EXIT_SUCCESS
es igual a 0
, y EXIT_FAILURE
es igual a 1
, lo que significa que no importa, pensó.
Comprobado en Linux (OpenSuse) y terminó con la misma cosa.
Devolver cero desde main()
hace esencialmente lo mismo que lo que estás preguntando. Devolver cero desde main()
no tiene que devolver cero al entorno de host.
Del documento estándar C90 / C99 / C ++ 98:
Si el valor del estado es cero o
EXIT_SUCCESS
, seEXIT_SUCCESS
una forma definida por la implementación de la terminación exitosa del estado.
El estándar simplemente está haciendo una determinación sobre cuál debe ser el valor cuando no se establece explícitamente. Depende de los desarrolladores establecer explícitamente el valor de retorno o asumir una semántica adecuada para el valor predeterminado. No creo que el lenguaje esté tratando de forzar ninguna semántica a los desarrolladores.
En realidad, return 0
no necesariamente devolverá 0! Estoy citando el estándar C aquí, porque es lo que mejor conozco.
Sobre el return
en main()
:
5.1.2.2.3 Terminación del programa
Si el tipo de retorno de la función principal es un tipo compatible con
int
, un retorno de la llamada inicial a la funciónmain
es equivalente a llamar a la función deexit
con el valor devuelto por la funciónmain
como su argumento;
Acerca de exit()
:
7.20.4.3 La función de salida
Sinopsis
#include <stdlib.h> void exit(int status);
[...]
Finalmente, el control se devuelve al entorno host. Si el valor delstatus
es cero oEXIT_SUCCESS
, seEXIT_SUCCESS
una forma definida por la implementación de la terminación exitosa del estado.
Los estándares de lenguaje informático dicen lo que un programa escrito en el lenguaje tiene que hacer y lo que sucederá. En este caso, los estándares C y C ++ dicen que devolver 0 señal de éxito, entre otras cosas.
Las implementaciones de lenguaje permiten que los programas se ejecuten en implementaciones particulares. Es tarea del implementador descubrir cómo hacer que la E / S funcione de acuerdo con el estándar, o darle al sistema operativo el código de resultado correcto.
Lo que hace un programa y lo que ve el sistema operativo no tiene que ser lo mismo. Todo lo que se necesita es que el programa funcione como dice el estándar en el sistema operativo dado.
OS / 360 y los sucesores usan un código de salida numérico, 0
generalmente es exitoso, 4
para advertencias (como un compilador que generó un mensaje de advertencia), 8
para error y 12
para errores especialmente graves (como no poder abrir SYSPRINT, el unidad de salida estándar).
Si también estuvieras pensando por qué el código de error para el éxito es 0 en lugar de cualquier otro valor, agregaría que podría haber sido históricamente por razones de rendimiento, ya que comparar con 0 ha sido mucho más rápido (creo que en arquitecturas modernas podría ser la clave). igual que con cualquier número) y, por lo general, no verifica un código de error en particular, solo si fue un éxito o algún error (por lo que tiene sentido usar la comparación más rápida para eso).