¿Por qué el valor de retorno predeterminado de main es 0 y no EXIT SUCCESS?


El estándar ISO 1998 c++ especifica que no usar explícitamente una instrucción return en main es equivalente a usar return 0. Pero, ¿qué pasa si una implementación tiene un código estándar "sin error" diferente, por ejemplo -1?

¿Por qué no usar la macro estándar EXIT_SUCCESS que sería reemplazada 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 el programa se comporta. Además, la situación es diferente para el valor de retorno "error": solo EXIT_FAILURE es un indicador de terminación estándar de" error", sin valor explícito, como" 1 " por ejemplo.

¿Cuáles son las razones de estas elecciones?

Author: durron597, 2009-07-27

9 answers

Devolver cero desde main() hace esencialmente lo mismo que lo que estás pidiendo. Devolver cero desde main() no tiene que devolver cero al entorno host.

Del documento estándar C90/C99/C++98:

Si el valor de status es cero o EXIT_SUCCESS, se devuelve una forma definida por la implementación del estado de terminación exitosa.

 34
Author: Michael Burr,
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
2013-10-06 13:25:00

En realidad, return 0 no necesariamente devolverá 0! Estoy citando el estándar C aquí, porque es lo que mejor conozco.

Acerca de {[2] {} en[3]}:

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ón main es equivalente a llamar a la función exit con el valor devuelto por la función main 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 de status es cero o EXIT_SUCCESS, una forma definida por la implementación del estado terminación exitosa es devolver.

 17
Author: Bastien Léonard,
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
2009-07-27 14:48:56

El estándar simplemente está determinando cuál debe ser el valor cuando no se establece explícitamente. Depende de los desarrolladores establecer explícitamente el valor devuelto o asumir una semántica apropiada para el valor predeterminado. No creo que el lenguaje esté tratando de forzar ninguna semántica a los desarrolladores.

 5
Author: Otávio Décio,
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
2009-07-27 14:08:47

0 es el código de salida estándar (éxito) en todos los sistemas POSIX, y todos los sistemas que conozco! Creo que ha sido de esta manera sinc tiempo begain (o al menos desde Unix lo hizo... Así que es por esta razón que diría.

¿Qué sistema sabes que es diferente?

 4
Author: jkp,
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
2009-07-27 14:07:12

0 como el código de retorno para el éxito, y los enteros positivos como errores es el estándar en C y Unix. Este esquema fue elegido porque normalmente a uno no le importa por qué un programa tuvo éxito, solo que lo hizo. Por otro lado, hay muchas maneras de que un programa falle con un error, y a menudo uno está interesado en esta información. Por lo tanto, tiene sentido usar un valor escalar para el éxito y un rango de valores para el error. El uso de enteros positivos es una convención C que ahorra memoria, ya que permitir que el código de error se defina como un int sin firmar.

 3
Author: ire_and_curses,
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
2009-07-27 14:27:31

El OS/360 y sus sucesores usan un código de salida numérico, 0 normalmente con éxito, 4 para advertencias (como un compilador que generó un mensaje de advertencia), 8 para errores, y 12 para errores especialmente graves (como ser incapaz de abrir SYSPRINT, la unidad de salida estándar).

 2
Author: glen,
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
2013-10-06 13:25:52

Los estándares del 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 indica éxito, entre otras cosas.

Las implementaciones de lenguaje permiten que los programas se ejecuten en implementaciones particulares. Es el trabajo del implementador averiguar 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 un programa hace y lo que el sistema operativo ve no tiene ser lo mismo. Todo lo que es necesario es que el programa funcione como dice el estándar en el sistema operativo dado.

 1
Author: David Thornley,
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
2009-07-27 14:56:46

Al navegar {[1] } terminé con dos líneas:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

Así que EXIT_SUCCESS es igual a 0, y EXIT_FAILURE es igual a 1, lo que significa que no importa, el pensamiento.

Comprobado en Linux (openSUSE) y terminó con lo mismo.

 1
Author: набиячлэвэли,
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
2013-10-22 20:04:36

Si también estuviera pensando en por qué el código de error para success 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 ligeramente más rápido (creo que en arquitecturas modernas podría ser lo mismo que con cualquier número) y generalmente no verifica un código de error en particular, solo si fue éxito o cualquier error (por lo que tiene sentido usar la comparación más rápida para eso).

 0
Author: fortran,
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
2009-07-27 16:27:48