¿Cuál es la firma adecuada de la main
función en C ++? ¿Cuál es el tipo de retorno correcto y qué significa devolver un valor main
? ¿Cuáles son los tipos de parámetros permitidos y cuáles son sus significados?
¿Es esto específico del sistema? ¿Han cambiado esas reglas con el tiempo? ¿Qué pasa si los violo?
main
regresar en C y C ++ .Respuestas:
La
main
función debe declararse como una función no miembro en el espacio de nombres global. Esto significa que no puede ser una función miembro estática o no estática de una clase, ni puede colocarse en un espacio de nombres (incluso el espacio de nombres sin nombre).El nombre
main
no está reservado en C ++, excepto como una función en el espacio de nombres global. Usted es libre de declarar otras entidades nombradasmain
, incluidas, entre otras cosas, clases, variables, enumeraciones, funciones miembro y funciones no miembros que no están en el espacio de nombres global.Puede declarar una función nombrada
main
como una función miembro o en un espacio de nombres, pero dicha función no sería lamain
función que designa el inicio del programa.La
main
función no se puede declarar comostatic
oinline
. Tampoco se puede sobrecargar; solo puede haber una función nombradamain
en el espacio de nombres global.los
main
función no se puede usar en su programa: no se le permite llamar a lamain
función desde ninguna parte de su código, ni se le permite tomar su dirección.El tipo de retorno de
main
debe serint
. No se permite ningún otro tipo de retorno (esta regla está en negrita porque es muy común ver programas incorrectos que declaranmain
con un tipo de retorno devoid
; esta es probablemente la regla más frecuentemente violada con respecto a lamain
función).Hay dos declaraciones
main
que deben permitirse:En (1) , no hay parámetros.
En (2) , hay dos parámetros y se denominan convencionalmente
argc
yargv
, respectivamente.argv
es un puntero a una matriz de cadenas C que representan los argumentos del programa.argc
es el número de argumentos en laargv
matriz.Por lo general,
argv[0]
contiene el nombre del programa, pero este no es siempre el caso.argv[argc]
se garantiza que es un puntero nulo.Tenga en cuenta que dado que un argumento de tipo matriz (como
char*[]
) es realmente solo un argumento de tipo puntero disfrazado, las dos siguientes son formas válidas de escribir (2) y ambas significan exactamente lo mismo:Algunas implementaciones pueden permitir otros tipos y números de parámetros; tendría que consultar la documentación de su implementación para ver qué admite.
main()
se espera que devuelva cero para indicar éxito y no cero para indicar falla. No es necesario que escriba explícitamente unareturn
declaración enmain()
: si dejamain()
regresar sin unareturn
declaración explícita , es lo mismo que si hubiera escritoreturn 0;
. Las siguientes dosmain()
funciones tienen el mismo comportamiento:Hay dos macros,
EXIT_SUCCESS
yEXIT_FAILURE
, definidas en<cstdlib>
eso, también se pueden devolvermain()
para indicar el éxito y el fracaso, respectivamente.El valor devuelto por
main()
se pasa a laexit()
función, que finaliza el programa.Tenga en cuenta que todo esto se aplica solo cuando se compila para un entorno alojado (informalmente, un entorno donde tiene una biblioteca estándar completa y hay un sistema operativo que ejecuta su programa). También es posible compilar un programa C ++ para un entorno independiente (por ejemplo, algunos tipos de sistemas integrados), en cuyo caso el inicio y la terminación están totalmente definidos por la implementación y
main()
es posible que ni siquiera se requiera una función. Sin embargo, si está escribiendo C ++ para un SO de escritorio moderno, está compilando para un entorno alojado.fuente
Main
ser una función miembro estática porque ni siquiera tiene funciones que no sean miembros. Incluso C89 requieremain
volverint
. No estoy suficientemente familiarizado con K&R C para conocer sus reglas exactas, pero supongo que también requieremain
regresarint
ya quemain
sin tipo de retorno era algo común y no type = implícitoint
en K&R.int
.void
tipo de retorno como una extensión de lenguaje . Los compiladores que no lo permiten incluyen GCC y Comeau.De los documentos estándar, 3.6.1.2 Función principal ,
int main() { / ... / }
yint main(int argc, char* argv[]) { / ... / }
Espero que ayude..
fuente
main
debería serint
?void
rompe ese modelo. Ni siquiera tiene sentido si tuvieras que significa "siempre considerar el éxito". Debido a que no tenía forma de decir si el proceso realmente falló, ¿ realmente tuvo éxito? No, vuelveint
.La redacción exacta del último estándar publicado (C ++ 14) es:
Esto deja en claro que la ortografía alternativa está permitida siempre que el tipo de
main
sea el tipoint()
oint(int, char**)
. Entonces lo siguiente también está permitido:int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
fuente
int main(void)
no era correcto en C ++.auto main() -> int
no tiene un tipo de devolución deducido. Preste atención a {in "(auto main () {... no está permitido)" y aprenda a saber cuándo aún no sabe lo suficiente como para agregar algo significativo.Los dos platos principales válidos son
int main()
yint main(int, char*[])
. Cualquier otra cosa puede o no compilarse. Simain
no devuelve un valor explícitamente, 0 se devuelve implícitamente.fuente
main
ser anulado. ¿Hay alguna razón específica por la que el tipo de retorno de main debería ser int?int
tipo de retornomain
es que este valor se entrega al shell como el código de salida del programa ysh
espera unint
.void
, todos están en silencio. Conint
tenemos que definir el valor de salida específico para cada retorno demain
.Detalles sobre los valores de retorno y su significado
Por 3.6.1 (
[basic.start.main]
):El comportamiento de
std::exit
se detalla en la sección 18.5 ([support.start.term]
) y describe el código de estado:fuente