una - tipos de funciones en lenguaje c
Valor de retorno del rango de la función principal. (7)
¿Qué dice la norma sobre el rango de valores de retorno principal? Di solo hasta 255?
Porque
int main(void){
return 256;
}
echo $? ; # out 0
5.1.2.2.3 Terminación del programa 1 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 principal es equivalente a llamar a la función de salida con el valor devuelto por la función principal como su argumento; 10) alcanzar el} que termina la función principal devuelve un valor de 0. Si el tipo de retorno no es compatible con int, el estado de terminación devuelto al entorno del host no se especifica
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
Es decir, no hay ningún requisito para que devuelva nada. Sin embargo, se afirma fuertemente a partir de lo que son las definiciones habituales. Casi dando a entender que son estándares, pero tiene una tarjeta para salir de la cárcel, lo que significa que puede ser cualquier cosa.
En Unix, la llamada al sistema de espera establece un valor de estado del tipo int empaquetado como un campo de bits con varios tipos de información de terminación secundaria. Si el hijo finalizó al salir (según lo determinado por la macro WIFEXITED; la alternativa habitual es que murió a causa de una señal no capturada), SUS especifica que los 8 bits más bajos del valor de estado contienen el estado de salida; esto se puede recuperar utilizando la macro WEXITSTATUS en wait.h. Como tal, en Unix, los estados de salida están restringidos a los valores 0-255 , el rango de un entero de 8 bits sin signo.
Los sistemas tipo Unix generalmente usan una convención de cero para el éxito y no de cero para el error. Algunas convenciones se han desarrollado en cuanto a los significados relativos de varios códigos de error; por ejemplo, GNU recomienda que los códigos con el conjunto alto de bits se reserven para errores graves, y FreeBSD ha documentado un amplio conjunto de interpretaciones preferidas.
El estándar C99 define solo 0 y 1. Sin embargo, permite que se utilicen otros valores.
Vea la wiki de Exit Status para más.
Como han dicho otros, los Estándares de C & C ++ no restringen los valores de retorno, excepto para indicar que (1) main
devuelve un int
(que es de un tamaño definido por la implementación) y (2) cero (o EXIT_SUCCESS
) es un retorno exitoso y EXIT_FAILURE
es un retorno no exitoso. Especifica que un main
que no devuelve explícitamente un valor se trata como si hubiera devuelto cero.
En este caso, la interpretación del valor de retorno depende del proceso que espera a que finalice el proceso (llamando a wait , waitpid o waitid ). wait y waitpid son las funciones POSIX más antiguas y especifican que solo los ocho bits menos significativos del valor de retorno estarán disponibles para un proceso principal en espera . El estándar POSIX: 2008 agregó waitid como un método de espera generalizado que tiene acceso al estado completo de salida de un proceso hijo.
Después de bifurcar un subproceso, otro proceso llama a una de las funciones de espera a dormir hasta que se complete el proceso bifurcado (por ejemplo, retornos de main
, llamadas exit
o abort
o algo así. Las funciones wait y waitpid devuelven el estado mediante un puntero a un entero. La persona que llama extrae el estado de salida real utilizando las WIFEXITED(status_val)
y WEXITSTATUS(status_val)
. Este último está definido por POSIX y se requiere que devuelva wait . La función waitid usa un puntero a una estructura siginfo_t
para devolver la información de estado del proceso. El miembro si_status
contiene el valor de estado completo como se describe en Información de estado .
Básicamente, los valores del estado de salida están en el ojo del espectador . Las especificaciones ANSI / ISO son abiertas. La suite POSIX tiene varias formas de esperar en un proceso para finalizar y recuperar su estado de salida. POSIX también define spawn como una versión más ligera de exec
que tiene su propio conjunto de restricciones en los valores de estado de salida. Los depósitos tienen el hábito de restringir aún más los valores de resultados: el bash de GNU limita el estado de retorno a 7 bits y un shell compatible con POSIX limita los valores de estado de salida a 8 bits. FWIW, la mayoría de las personas están de acuerdo en que restringir sus valores de retorno a valores inferiores a 64 parece ser seguro .
El estándar C no impone una limitación particular a los códigos de salida, el párrafo sobre el valor de retorno de los delegados main
a la documentación sobre la función exit()
, que a su vez dice:
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. Si el valor del estado esEXIT_FAILURE
, seEXIT_FAILURE
una forma definida por la implementación del estado de terminación fallida. De lo contrario, el estado devuelto está definido por la implementación.
que, aparte de las directrices EXIT_SUCCESS
/ EXIT_FAILURE
, básicamente significa "hacer lo que quieras". :)
Como se dijo en un comentario, el hecho de que en los sistemas POSIX solo se consideren los 8 bits más bajos del código de salida es solo un UNIXism, derivado de cómo se diseña el syscall de wait
(el estado de salida se debe empaquetar en los 8 bits más bajos) del valor de retorno de wait
), y no tiene nada que ver con el estándar C.
Un contraejemplo es Windows, donde se considera todo el valor pasado para exit
/ return
(siempre que no sea más grande que un DWORD
1 , pero no creo que alguna vez hagan que int
sea más grande que un DWORD
, se rompería un mucho código).
GetExitCodeProcess
reservado para devolver este valor es un DWORD *
. La norma no dice. 0
, EXIT_SUCCESS
y EXIT_FAILURE
tienen (más o menos) significados específicos. Cualquier otra cosa depende de la implementación.
Actualmente, la mayoría de los sistemas basados en Unix solo admiten valores de retorno de 8 bits. Windows admite (al menos) un valor de retorno de 32 bits. No he comprobado si Windows de 64 bits admite un valor de retorno de 64 bits, pero lo dudo, ya que incluso Windows de 64 bits normalmente todavía usa un int de 32 bits.
Los códigos de salida son un número entre 0 y 255 inclusive en Unix como sistema. Puede devolver cualquier cosa, pero en Linux está modded 256. Eche un vistazo here para obtener una buena explicación de los códigos de retorno de Linux. También hay un artículo de Wikipedia sobre el tema que habla brevemente sobre los códigos de salida para Windows.
Usted devuelve tipo int
. Debería poder devolver cualquier valor que se pueda almacenar en un int
. El tamaño exacto de un int
depende de la implementación, por lo que no puedo darle un rango exacto.