Espacios de nombres
Variantes
Acciones

Función Main

De cppreference.com
< cpp‎ | language

Un programa debe contener una función global llamada main, que es punto de entrada al programa. Debe tener uno de los siguientes formatos:

int main () { cuerpo } (1)
int main (int argc, char *argv[]) { cuerpo } (2)
/* otra forma definida por la implementación, que tenga ''int'' como tipo de retorno */ (3)
argc - Valor no negativo que indica el número de argumentos enviados al programa desde el entrono donde se ejecuta.
argv - Puntero al primer elemento de una matriz de punteros a cadenas de texto terminadas en nulo que representan los argumentos pasados al programa desde el entorno de ejecución (argv[0] hasta argv[argc-1]). Se garantiza que el valor argv[argc] es un puntero nulo.
cuerpo - El cuerpo de la función main

Los nombres argc yargv son arbitrarios, así como la representación de los parámetros: int main(int ac, char** av) también es válido.

Un formato definido por la implementación bastante común de la función main() añade un tercer argumento (además de argc y argv), de tipo char*[], que apunta a una matriz de punteros a variables de entorno de ejecución.

[editar] Explicación

Se llama a la función main al inicio del programa, después de la inicialización de los objetos no locales con tiempo de almacenamiento estático. Es el punto de entrada designado para un programa que se ejecuta en un entorno alojado (es decir, con un sistema operativo). Los puntos de entrada a los programas independientes (cargadores de arranque, núcleos de sistema operativo, etc.) están definidos por la implementación.

Los parámetros de la función main, con formato de dos parámetros, permiten que se pasen desde el entrono de ejecución un número arbitrario de cadenas de caracteres multibyte (normalmente conocidos como argumentos de línea de comandos), los punteros argv[1] .. argv[argc-1] apuntan al primer carácter de cada una de esas cadenas. argv[0] es el puntero al carácter inicial de una cadena multibyte terminada en nulo que representa el nombre usado para invocar el programa (o una cadena vacía ”” si no está soportado por el entorno de ejecución). Las cadenas de texto se pueden modificar, aunque esas modificaciones no se propagan hacia atrás al entorno de ejecución: se pueden usar, por ejemplo, con std::strtok. El tamaño de la matriz de punteros argv es al menos argc + 1, y el último elemento, argv[argc], debe ser un puntero nulo.

La función main tiene varias propiedades especiales:

1) No se puede utilizar en ningún lugar del programa
a) en particular, no se puede llamar recursivamente
b) no se puede obtener su dirección
2) No se puede predefinir ni sobrecargar: el nombre main está reservado para funciones en el espacio de nombres global (aunque se puede usar para nombrar clases, espacios de nombre, enumeraciones, y cualquier entidad fuera del espacio de nombres global, exceptuando que la función main no se puede declarar con enlazado de lenguaje C en cualquier espacio de nombres (desde C++17))
3) No se puede definir como eliminada o declarada con enlazado de lenguaje C (desde C++17), inline, static, o constexpr.
4) El cuerpo de la función main no necesita contener la sentencia return: si el control llega al final de main sin encontrar la sentencia return, es como ejecutar return 0;.
5) La ejecución de return (o el return implícito al llegar al final de main) es equivalente a primero abandonar la función normalmente (destruyendo los objetos con duración de almacenamiento automático) y luego llamar a std::exit con el mismo argumento que return. (std::exit destruye los objetos estáticos y termina el programa).
6) Si la función main se define con un bloque función-try, las excepciones lanzadas por los destructores de objetos estáticos (que son destruidas por std::exit implícito) no se capturan.
7) (desde C++14) No se puede deducir el tipo de retorno de la función main (no se permite auto main() {}).

[editar] Notas

La forma en que los argumentos dados en la línea de comandos del Sistema Operativo se convierten en las matrices multibyte a las que hace referencia argv puede implicar el procesamiento definido por la implementación:

[editar] Ver también

Documentación de C de función main()