Nunca debe usar EXIT_SUCCESS
o EXIT_FAILURE
fuera del contexto de una llamada al exit()
o el valor de retorno a main()
. Los valores de estos enteros no están especificados por el estándar, por lo que no puede escribir código portátil si supone que son 0 o 1 respectivamente.
El estándar especifica que exit(0)
y una return 0
de main()
se comportan de la misma manera que exit(EXIT_SUCCESS)
y return EXIT_SUCCESS
, pero estos valores son "especiales" en el que se han de interpretar de una manera definida por la implementación. Es decir, el valor real pasado al sistema puede no ser 0, y el valor constante de EXIT_SUCCESS
es libre de no ser 0 si la implementación lo desea, siempre que return 0
desde main y return EXIT_SUCCESS
desde main se comporten de la misma manera.
Si usa estos valores en sus funciones, las personas que llaman tendrán que comparar directamente con EXIT_SUCCESS
para determinar si la función fue exitosa, lo que personalmente me parecería muy inconveniente.
int MyFunction1() { /* ... */ return EXIT_SUCCESS; }
int MyFunction2() { /* ... */ return 0; }
// Portable:
if (MyFunction1() == EXIT_SUCCESS) { ... }
if (MyFunction2() == 0) { ... }
if (!MyFunction2()) { ... }
// Not portable:
if (MyFunction1() == 0) { ... }
if (!MyFunction1()) { ... }
if (MyFunction2() == EXIT_SUCCESS) { ... }
El problema se hace más evidente con EXIT_FAILURE
:
int MyFunction1() { /*... */ return EXIT_FAILURE; }
// Not portable
if (MyFunction1()) { ... }
if (MyFunction1() == 1) { ... }
// The only way to make this portable.
if (MyFunction1() == EXIT_FAILURE) { ... }
Te recomiendo que elimines los puntos y comas de tus definiciones ;-) –
Tienes razón hacker, gracias por señalarlo.- – MRFerocius