Es una pregunta simple, pero sigo viendo respuestas contradictorias: ¿debería volver la rutina principal de un programa C ++ 0
o EXIT_SUCCESS
?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
o
int main(){return 0;}
¿Son exactamente lo mismo? ¿ EXIT_SUCCESS
Solo debe usarse con exit()
?
Pensé EXIT_SUCCESS
que sería una mejor opción porque otro software puede considerar cero como un fracaso, pero también escuché que si regresa 0
, el compilador es capaz de cambiarlo a un valor diferente de todos modos.
c++
c
return-value
main
Trevor Hickey
fuente
fuente
0
yEXIT_SUCCESS
ambos se interpretan como un éxito.Respuestas:
EXIT_FAILURE
, ya sea en una declaración de devoluciónmain
o como argumento paraexit()
, es la única forma portátil de indicar un error en un programa C o C ++.exit(1)
en realidad puede indicar una terminación exitosa en VMS, por ejemploSi va a usar
EXIT_FAILURE
cuando su programa falla, entonces también podría usarloEXIT_SUCCESS
cuando tenga éxito, solo por el bien de la simetría.Por otro lado, si el programa nunca señala una falla, puede usar cualquiera
0
oEXIT_SUCCESS
. Ambos están garantizados por el estándar para indicar la finalización exitosa. (Es casi imposible queEXIT_SUCCESS
pueda tener un valor distinto de 0, pero es igual a 0 en cada implementación de la que he oído hablar).El uso
0
tiene la pequeña ventaja de que no necesita#include <stdlib.h>
en C, o#include <cstdlib>
en C ++ (si está usando unareturn
instrucción en lugar de llamarexit()
), pero para un programa de cualquier tamaño significativo, incluirá stdlib directa o indirectamente de todas formas.Para el caso, en C comenzando con el estándar de 1999, y en todas las versiones de C ++, llegar al final de
main()
lo implícito dereturn 0;
todos modos, por lo que es posible que no necesite usar ninguno0
oEXIT_SUCCESS
explícitamente. (Pero al menos en C, considero que un estilo explícitoreturn 0;
es mejor).(Alguien preguntó sobre OpenVMS. No lo he usado en mucho tiempo, pero como recuerdo, los valores de estado impares generalmente denotan éxito, mientras que los valores pares denotan fallas. La implementación de C se asigna
0
a1
, lo quereturn 0;
indica una terminación exitosa. Otros valores se pasan sin cambios , por lo quereturn 1;
también indica una terminación exitosa.EXIT_FAILURE
tendría un valor par distinto de cero).fuente
0
yEXIT_SUCCESS
no se garantiza que tengan el mismo valor (lo mencioné en mi respuesta), pero ambos denotan una terminación exitosa.EXIT_SUCCESS
es estilísticamente mejor si también lo estás usandoEXIT_FAILURE
, peroexit(0)
está bien.No importa. Ambos son lo mismo.
Cotizaciones estándar de C ++:
fuente
EXIT_SUCCESS == 0
. Por otro lado, no hay una buena razón para que no lo sea.0 es, por definición, un número mágico. EXIT_SUCCESS es casi universalmente igual a 0, felizmente. Entonces, ¿por qué no simplemente regresar / salir 0?
salir (EXIT_SUCCESS); es abundantemente claro en significado.
salida (0); por otro lado, es contraintuitivo de alguna manera. Alguien que no esté familiarizado con el comportamiento de shell podría suponer que 0 == falso == malo, al igual que cualquier otro uso de 0 en C. Pero no, en este caso especial, 0 == éxito == bueno. Para los desarrolladores más experimentados, no será un problema. Pero, ¿por qué tropezar con el chico nuevo sin ninguna razón?
tl; dr: si hay una constante definida para su número mágico, casi nunca hay una razón para no usar la constante en primer lugar. Es más fácil de buscar, a menudo más claro, etc. y no le cuesta nada.
fuente
fclose()
,setvbuf()
, ...), POSIX (listen()
,pthread_create()
,pipe()
, ...), y muchas, muchas otras bibliotecas (por ejemplo OpenGL [glGetError()
], zlib [deflate()
/inflate()
/ ...], SDL [SDL_CreateWindowAndRenderer()
/ ...], y más).Esta es una historia interminable que refleja los límites (un mito) de "interoperabilidad y portabilidad sobre todo".
Lo que el programa debe devolver para indicar "éxito" debe definirse por quién recibe el valor (el sistema operativo o el proceso que invocó el programa) no por una especificación de lenguaje.
Pero a los programadores les gusta escribir código de "manera portátil" y, por lo tanto, inventan su propio modelo para el concepto de "sistema operativo" que define los valores simbólicos a devolver.
Ahora, en un escenario de muchos a muchos (donde muchos idiomas sirven para escribir programas en muchos sistemas), la correspondencia entre la convención de lenguaje para el "éxito" y el sistema operativo (que nadie puede garantizar que sea siempre el mismo) ser manejado por la implementación específica de una biblioteca para una plataforma objetivo específica.
Pero, desafortunadamente, estos conceptos no estaban tan claros en el momento en que se implementó el lenguaje C (principalmente para escribir el núcleo UNIX), y los gigagramos de libros donde se escribieron diciendo "retorno 0 significa éxito", ya que eso era cierto en el sistema operativo en esa vez tener un compilador de C.
A partir de entonces, nunca se hizo una estandarización clara sobre cómo se debería manejar dicha correspondencia. C y C ++ tienen su propia definición de "valores de retorno", pero nadie otorga una traducción adecuada del sistema operativo (o mejor: ninguna documentación del compilador dice nada al respecto). 0 significa éxito si es cierto para UNIX - LINUX y -por razones independientes- también para Windows, y esto cubre el 90% de las "computadoras de consumo" existentes, que - en la mayoría de los casos - ignoran el valor de retorno (para que podamos discutir durante décadas, ¡pero nadie lo notará!)
Dentro de este escenario, antes de tomar una decisión, haga estas preguntas: - ¿Me interesa comunicarle algo a mi interlocutor sobre mi existencia? (Si siempre devuelvo 0 ... no hay ninguna pista detrás de todo) - ¿Mi persona que llama tiene convenciones sobre esta comunicación? (Tenga en cuenta que un solo valor no es una convención: eso no permite ninguna representación de información)
Si ambas respuestas son no, probablemente la buena solución es no escribir la declaración de devolución principal. (Y deje que el compilador decida, con respecto al objetivo, está trabajando).
Si no hay una convención establecida 0 = el éxito cumple con la mayoría de las situaciones (y el uso de símbolos puede ser problemático si introducen una convención).
Si existen convenciones, asegúrese de utilizar constantes simbólicas que sean coherentes con ellas (y garantice la coherencia de las convenciones, no la coherencia de valores, entre plataformas).
fuente
Una vez que comienza a escribir código que puede devolver una miríada de estados de salida, comienza
#define
a usarlos todos. En este casoEXIT_SUCCESS
tiene sentido en el contexto de no ser un " número mágico ". Esto hace que su código sea más legible porque cualquier otro código de salida lo seráEXIT_SOMETHING
. Si simplemente escribe un programa que regresará cuando esté hecho,return 0
es válido y probablemente incluso más limpio porque sugiere que no hay una estructura de código de retorno sofisticada.fuente
Lo que devuelve de un programa es solo una convención.
No, no puedo pensar en ninguna circunstancia en la que "EXIT_SUCCESS" no sea "0".
Personalmente, recomendaría "0".
EN MI HUMILDE OPINIÓN...
fuente
0
es falso y muchas funciones regresan0
en caso de falla / no hacen nada.Si usa EXIT_SUCCESS, su código será más portátil.
http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/
fuente
EXIT_SUCCESS
ambos denotan una terminación exitosa.Algunos compiladores pueden crear problemas con esto: en un compilador de Mac C ++, EXIT_SUCCESS funcionó bien para mí, pero en un compilador de Linux C ++ tuve que agregar cstdlib para saber qué es EXIT_SUCCESS. Aparte de eso, son uno y lo mismo.
fuente
EXIT_SUCCESS
trabajó sin incluir ninguno<stdlib.h>
o<cstdlib>
, algún otro encabezado debe haberlo definido, directa o indirectamente. En C ++, es común para encabezados estándar a#include
otros encabezados estándar. Si esto se compila sin error:int main() { return EXIT_SUCCESS; }
entonces su compilador probablemente tenga errores.