La función main
Cada programa en C codificado para ejecutarse en un entorno de ejecución hospedado contiene la definición (no el prototipo) de una función llamada main, que es el inicio designado del programa.
int main (void) { cuerpo }
|
(1) | ||||||||
int main (int argc, char *argv[]) { cuerpo }
|
(2) | ||||||||
/* otra forma definida por la implementación */ (desde C99)
|
(3) | ||||||||
Parametros
| argc | - | Valor no negativo que representa el número de argumentos pasados al programa desde el entorno en el que se ejecuta el programa. |
| argv | - | Puntero a un arreglo de punteros a cadenas de multibytes con terminación nula que representan los argumentos pasados al programa desde el entorno de ejecución. (argv[0] a través de argv[argc-1]). El valor de argv[argc] está garantizado que será 0.
|
Los nombres argc y argv son arbitrarios, así como la representación de los tipos de parámetros: int main(int ac, char** av) es igualmente válido.
Una forma común definida por la implementación de main es
int main(int argc, char *argv[], char *envp[]), donde un tercer argumento, de tipo char*[], apunta a un arreglo de punteros a las variables de entorno de la ejecución.
Valor de retorno
Si se utiliza la sentencia return, el valor retornado se utiliza como argumento para la llamada implícita a exit() (ver abajo para más detalles). Los valores cero y EXIT_SUCCESS indican una terminación correcta, el valor EXIT_FAILURE indica una terminación incorrecta.
Explicación
La función main se llama al iniciar el programa, después de inicializar todos los objetos con duración de almacenamiento estático. Es el punto de entrada designado a un programa que se ejecuta en un entorno hospedado (es decir, con un sistema operativo). El nombre y tipo del punto de entrada a cualquier programa autónomo (cargadores de arranque, núcleos de SO, etc.) están definidos en la implementación.
Los parámetros de la variante de dos parámetros de la función main permiten que se pasen cadenas de caracteres multibyte arbitrarias desde el entorno de ejecución (estos se conocen típicamente como argumentos de línea de comandos). Los punteros argv[1] .. argv[argc-1] apuntan a los primeros caracteres de cada una de estas cadenas. argv[0] es el puntero al carácter inicial de una cadena de multibytes con terminación nula que representa el nombre con el que se invoca al propio programa (o, si el entorno de ejecución no lo permite, argv[0][0] está garantizado que será cero).
Si el entorno de ejecución no puede distinguir entre mayúsculas y minúsculas, los argumentos de la línea de comandos se convierten a minúsculas.
Las cadenas de texto son modificables, y las modificaciones realizadas persisten hasta la finalización del programa, aunque estas modificaciones no se propagan de nuevo al entorno de ejecución: pueden utilizarse, por ejemplo, con strtok.
El tamaño del arreglo apuntado por argv es al menos argc+1, y el último elemento, argv[argc], está garantizado que será un puntero nulo.
La función main tiene varias propiedades especiales:
int, entonces el retorno de la llamada inicial a main (pero no el retorno de cualquier llamada recursiva posterior) es equivalente a ejecutar la función exit, con el valor que la función main está retornando pasado como argumento (el cual llama a las funciones registradas con atexit, limpia y cierra todos los canales, y borra todos los archivos creados con tmpfile, y retorna el control al entorno de ejecución).|
Si la función main ejecuta un |
(hasta C99) |
|
Si el tipo de retorno de la función main no es compatible con |
(desde C99) |
Ejemplo
Demuestra cómo informar a un programa sobre dónde encontrar su información y dónde escribir sus resultados. Ejecución: ./a.out archivodeentrada archivodesalida
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("argc = %d\n", argc);
for(int ndx = 0; ndx != argc; ++ndx)
printf("argv[%d] --> %s\n", ndx,argv[ndx]);
printf("argv[argc] = %p\n", (void*)argv[argc]);
}
Posible salida:
argc = 3
argv[0] --> ./a.out
argv[1] --> archivodeentrada
argv[2] --> archivodesalida
argv[argc] = (nil)
Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 5.1.2.2.1 Program startup (p: 13)
- Standard C99 (ISO/IEC 9899:1999):
- 5.1.2.2.1 Program startup (p: 12)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 5.1.2.2 Hosted environment
Véase también
Documentación de C++ para La función main
|