Main function
Todo 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 firma definida por la implementación */ (desde C99) | (3) | ||||||||
Contenidos |
Parámetros
| 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 al primer elemento de un array de argc + 1 punteros, de los cuales el último es nulo y los anteriores, si los hay, apuntan a cadenas que representan los argumentos pasados al programa desde el entorno host. Si argv [ 0 ] no es un puntero nulo (o, equivalentemente, si argc > 0), apunta a una cadena que representa el nombre del programa, la cual está vacía si el nombre del programa no está disponible desde el entorno host. |
Los nombres
argc
y
argv
significan "contador de argumentos" y "vector de argumentos", y se utilizan tradicionalmente, pero pueden elegirse otros nombres para los parámetros, así como diferentes pero equivalentes declaraciones de su tipo:
int
main
(
int
ac,
char
**
av
)
es igualmente válido.
Una implementación definida común de main es int main ( int argc, char * argv [ ] , char * envp [ ] ) , donde se añade un tercer argumento, de tipo char ** , que apunta a un array de punteros a las variables de entorno de ejecución .
Valor de retorno
Si se utiliza la sentencia return, el valor de retorno se utiliza como argumento para la llamada implícita a exit() (ver más abajo para detalles). Los valores cero y EXIT_SUCCESS indican terminación exitosa, el valor EXIT_FAILURE indica terminación fallida.
Explicación
La función
main
se llama al inicio del programa, después de que se inicializan todos los objetos con duración de almacenamiento estático. Es el punto de entrada designado para un programa que se ejecuta en un entorno
hospedado
(es decir, con un sistema operativo). El nombre y tipo del punto de entrada para cualquier programa
independiente
(cargadores de arranque, kernels del SO, etc.) están definidos por la implementación.
Los parámetros de la forma de dos parámetros de la función principal permiten pasar cadenas de caracteres multibyte arbitrarias desde el entorno de ejecución (estas se conocen típicamente como argumentos de línea de comandos ). Los punteros argv [ 1 ] .. argv [ argc - 1 ] apuntan a los primeros caracteres en cada una de estas cadenas. argv [ 0 ] (si no es nulo) es el puntero al carácter inicial de una cadena multibyte terminada en nulo que representa el nombre utilizado para invocar el programa mismo (o, si esto no es compatible con el entorno host, argv [ 0 ] [ 0 ] está garantizado que será cero).
Si el entorno del host no puede proporcionar letras minúsculas y mayúsculas, los argumentos de la línea de comandos se convierten a minúsculas.
Las cadenas son modificables, y cualquier modificación realizada persiste hasta la terminación del programa, aunque estas modificaciones no se propagan de vuelta al entorno host: pueden usarse, por ejemplo, con strtok .
El tamaño del array apuntado por
argv
es al menos
argc+1
, y el último elemento,
argv[argc]
, está garantizado que es un puntero nulo.
La función
main
tiene varias propiedades especiales:
|
Si la función main ejecuta un return que no especifica ningún valor o, lo que es equivalente, alcanza la llave de cierre } sin ejecutar un return , el estado de terminación devuelto al entorno host es indefinido. |
(hasta C99) |
|
Si el tipo de retorno de la función main no es compatible con int (por ejemplo void main ( void ) ), el valor devuelto al entorno host no está especificado. Si el tipo de retorno es compatible con int y el control alcanza la llave de cierre } , el valor devuelto al entorno es el mismo que si se ejecutara return 0 ; . |
(desde C99) |
Ejemplo
Demuestra cómo informar a un programa sobre dónde encontrar su entrada y dónde escribir sus resultados. Invocación: ./a.out archivoentrada archivosalida
Salida posible:
argc = 3 argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (nil)
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 5.1.2.2.1 Inicio del programa (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 5.1.2.2.1 Inicio del programa (p: 10-11)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 5.1.2.2.1 Inicio del programa (p: 13)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 5.1.2.2.1 Inicio del programa (p: 12)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 5.1.2.2 Entorno hospedado
Véase también
|
Documentación de C++
para la
main
function
|