c++ - todas - tipos de funciones en c
¿Cuál es la declaración correcta de main? (5)
¿Cuál es la firma correcta de la función main
en C ++? ¿Cuál es el tipo de devolución correcto y qué significa devolver un valor desde main
? ¿Cuáles son los tipos de parámetros permitidos y cuáles son sus significados?
Es este sistema específico? ¿Han cambiado esas reglas con el tiempo? ¿Qué pasa si los violo?
De los documentos estándar., 3.6.1.2 Función principal ,
Tendrá un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones permitirán ambas de las siguientes definiciones de main:
int main() { / ... / }
e int main(int argc, char* argv[]) { / ... / }
En la última forma,
argc
será el número de argumentos pasados al programa desde el entorno en el que se ejecuta el programa. Si argc es distinto de cero, estos argumentos se suministrarán en argv [0] a través de argv [argc-1] como punteros al caracteres iniciales de cadenas multibyte terminadas en nulo .....
Espero que ayude..
La función main
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 nombre sin nombre).
El nombre main
no está reservado en C ++, excepto como una función en el espacio de nombres global. Puede declarar otras entidades denominadas main
, incluidas, entre otras cosas, clases, variables, enumeraciones, funciones miembro y funciones no miembro no incluidas en el espacio de nombres global.
Puede declarar una función llamada main
como una función miembro o en un espacio de nombres, pero dicha función no sería la función main
que designa dónde se inicia el programa.
La función main
no se puede declarar como static
o en inline
. Tampoco puede ser sobrecargado; solo puede haber una función llamada main
en el espacio de nombres global.
La función main
no se puede utilizar en su programa: no se le permite llamar a la función main
desde ningún lugar de su código, ni se le permite tomar su dirección.
El tipo de retorno de main
debe ser int
. No se permite ningún otro tipo de devolución (esta regla está en negrita porque es muy común ver programas incorrectos que declaran main
con un tipo de void
de retorno, esta es probablemente la norma más frecuentemente violada con respecto a la función main
).
Hay dos declaraciones de main
que deben permitirse:
int main() // (1)
int main(int, char*[]) // (2)
En (1) , no hay parámetros.
En (2) , hay dos parámetros y se llaman convencionalmente argc
y argv
, respectivamente. argv
es un puntero a una matriz de cadenas en C que representan los argumentos del programa. argc
es la cantidad de argumentos en la matriz argv
.
Usualmente, argv[0]
contiene el nombre del programa, pero este no es siempre el caso. argv[argc]
garantiza que es un puntero nulo.
Tenga en cuenta que dado que un argumento de tipo de matriz (como char*[]
) es realmente solo un argumento de tipo de puntero en el disfraz, las dos siguientes son ambas formas válidas de escribir (2) y ambas significan exactamente lo mismo:
int main(int argc, char* argv[])
int main(int argc, char** argv)
Algunas implementaciones pueden permitir otros tipos y números de parámetros; Debería verificar la documentación de su implementación para ver qué es lo que admite.
main()
se espera que devuelva cero para indicar éxito y no cero para indicar falla. No es necesario que escriba explícitamente una declaración de return
en main()
: si deja que main()
regrese sin una declaración de return
explícita, es lo mismo que si hubiera escrito return 0;
. Las siguientes dos funciones main()
tienen el mismo comportamiento:
int main() { }
int main() { return 0; }
Hay dos macros, EXIT_SUCCESS
y EXIT_FAILURE
, definidas en <cstdlib>
que también se pueden devolver desde main()
para indicar el éxito y el fracaso, respectivamente.
El valor devuelto por main()
pasa a la función exit()
, que finaliza el programa.
Tenga en cuenta que todo esto se aplica solo al compilar para un entorno alojado (informalmente, un entorno en el que 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 completamente definidos en la implementación y una función main()
puede que ni siquiera sea necesaria. Sin embargo, si está escribiendo C ++ para un sistema operativo de escritorio moderno, está compilando para un entorno alojado.
La redacción exacta del último estándar publicado (C ++ 14) es:
Una implementación permitirá tanto
una función de
()
devolverint
yuna función de
(int
, puntero a puntero achar)
devuelveint
como el tipo de
main
.
Esto deja en claro que se permiten deletreos alternativos siempre que el tipo de main
sea del tipo int()
o int(int, char**)
. Por lo tanto, también se permiten los siguientes:
-
int main(void)
-
auto main() -> int
-
int main ( )
-
signed int main()
-
typedef char **a; typedef int b, e; e main(bd, ac)
Las dos líneas principales válidas son int main()
e int main(int, char*[])
. Cualquier otra cosa puede compilar o no. Si main
no devuelve explícitamente un valor, 0 se devuelve implícitamente.
Detalles sobre los valores de retorno y su significado
Según 3.6.1 ( [basic.start.main]
):
Una instrucción de retorno en
main
tiene el efecto de dejar la funciónmain
(destruir cualquier objeto con duración de almacenamiento automático) y llamar astd::exit
con el valor de retorno como argumento. Si el control llega al final demain
sin encontrar una instrucciónreturn
, el efecto es el de ejecutar
return 0;
El comportamiento de std::exit
se detalla en la sección 18.5 ( [support.start.term]
), y describe el código de estado:
Finalmente, el control se devuelve al entorno de host. Si el estado es cero o
EXIT_SUCCESS
, seEXIT_SUCCESS
una forma definida por la implementación del estado de finalización exitosa. Si el estado esEXIT_FAILURE
, seEXIT_FAILURE
una forma definida por la implementación de la terminación de estado fallido. De lo contrario, el estado devuelto está definido por la implementación.