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 con el nombre main
, que incluyen, entre otras cosas, clases, variables, enumeraciones, funciones miembro y funciones que no son miembro, no en el espacio de nombres global.
Puede declarar una función denominada 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 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 devolución de void
; esta es probablemente la norma más infringida con respecto a la función main
).
Hay dos declaraciones de main
que deben ser permitidos:
int main() // (1)
int main(int, char*[]) // (2)
En (1), no hay parámetros.
En (2), hay dos parámetros y que convencionalmente se denominan argc
y argv
, respectivamente. argv
es un puntero a una matriz de cadenas C que representan los argumentos del programa. argc
es la cantidad de argumentos en la matriz argv
.
Normalmente, 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 desde un argumento tipo de matriz (como char*[]
) es en realidad un argumento de tipo puntero en el disfraz, los dos siguientes son dos formas válidas para escribir (2) y ambos 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 regrese a cero para indicar el éxito y que no sea cero para indicar la falla. No es necesario que escriba explícitamente una declaración return
en main()
: si deja que main()
devuelva sin una declaración explícita return
, es lo mismo que si hubiera escrito return 0;
. Los siguientes dos main()
funciones tienen el mismo comportamiento:
int main() { }
int main() { return 0; }
Hay dos macros, EXIT_SUCCESS
y EXIT_FAILURE
, definidos en <cstdlib>
que también se pueden devolver desde main()
para indicar el éxito y el fracaso, respectivamente.
El valor devuelto por main()
se 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 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 completamente definidos por la implementación y es posible que ni siquiera se requiera una función main()
. Sin embargo, si está escribiendo C++ para un sistema operativo de escritorio moderno, está compilando para un entorno alojado.
Esto está muy estrechamente relacionado con, o un duplicado de, [¿Qué debe 'main' return en C y C++] (http://stackoverflow.com/questions/204476/what-sho uld-main-return-in-c-and-c/18721336 # 18721336). –
@JonathanLeffler No es broma ... se agregó a la lista de duplicados en [revisión 6] (http://stackoverflow.com/revisions/204476/6) hace aproximadamente 8 meses. – fredoverflow