Main function
Un programa deberá contener una función del espacio de nombres global denominada main , que es el inicio designado del programa en un entorno hospedado. Deberá tener una de las siguientes formas:
int
main() {
cuerpo
}
|
(1) | ||||||||
int
main(
int
argc
,
char
*
argv
[]
) {
cuerpo
}
|
(2) | ||||||||
int
main(
/* implementation-defined */
) {
cuerpo
}
|
(3) | ||||||||
main
que se ejecuta independientemente de los argumentos proporcionados por el entorno.
main
que acepta argumentos proporcionados por el entorno.
main
de tipo definido por la implementación, que retorna
int
.
main
que coloquen los parámetros adicionales (opcionales) después de
argv
.
| 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 multibyte terminadas en nulo que representan los argumentos pasados al programa desde el entorno de ejecución. Si argv [ 0 ] no es un puntero nulo (o, equivalentemente, si argc > 0 ), apunta a una cadena que representa el nombre utilizado para invocar el programa, o a una cadena vacía. |
| body | - |
El cuerpo de la función
main
.
|
Contenidos |
Explicación
La función
main
se llama al inicio del programa después de la
inicialización
de los objetos no locales con
duración de almacenamiento
estática. Es el punto de entrada designado para un programa que se ejecuta en un entorno
hospedado
(es decir, con un sistema operativo). Los puntos de entrada para programas
independientes
(cargadores de arranque, kernels de SO, etc.) están definidos por la implementación.
Los parámetros de la forma de dos parámetros de la función
main
permiten pasar cadenas de caracteres multibyte arbitrarias desde el entorno de ejecución (normalmente conocidas 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 una cadena vacía
""
si esto no es compatible con el entorno de ejecución). Las cadenas son modificables, aunque estas modificaciones no se propagan de vuelta al entorno de ejecución: pueden usarse, por ejemplo, con
std::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 las siguientes propiedades especiales:
main
no necesita contener la
return
sentencia
: si el control alcanza el final de
main
sin encontrar una sentencia return, el efecto es equivalente a ejecutar
return
0
;
.
main
) es equivalente a primero salir de la función normalmente (lo cual destruye los objetos con duración de almacenamiento automático
y evalúa cualquier
aserción de postcondición
de
main
(desde C++26)
) y luego llamar a
std::exit
con el mismo argumento que el argumento del
return
(
std::exit
luego destruye los objetos estáticos y termina el programa).
La función
main
tiene varias restricciones (cuya violación hace que el programa esté mal formado):
main
en el espacio de nombres global está reservado para funciones (aunque puede usarse para nombrar clases, espacios de nombres, enumeraciones y cualquier entidad en un espacio de nombres no global, excepto que una entidad llamada
main
no puede declararse con
vinculación de lenguaje C
en cualquier espacio de nombres).
constexpr
(since C++11)
,
consteval
(since C++20)
,
inline
, o
static
.
|
4)
El tipo de retorno de la función
main
no puede ser deducido (
auto
main
(
)
{
...
}
no está permitido).
|
(since C++14) |
| (since C++20) |
Notas
Si la función
main
está definida con un
bloque
try
de función
, las excepciones lanzadas por los destructores de objetos estáticos (que son destruidos por la llamada implícita a
std::exit
) no son
capturadas
por este.
La manera en que los argumentos proporcionados en la línea de comandos del sistema operativo se convierten en los arreglos de caracteres multibyte referenciados por argv puede involucrar procesamiento definido por la implementación:
Una implementación definida muy común de main ( ) tiene un tercer argumento (además de argc y argv ), de tipo char ** , que apunta a un array de punteros a las variables de entorno de ejecución .
Ejemplo
Demuestra cómo informar a un programa dónde encontrar su entrada y dónde escribir sus resultados.
Una posible invocación:
.
/
convert table_in.
dat
table_out.
dat
#include <cstdlib> #include <iomanip> #include <iostream> int main(int argc, char *argv[]) { std::cout << "argc == " << argc << '\n'; for (int ndx{}; ndx != argc; ++ndx) std::cout << "argv[" << ndx << "] == " << std::quoted(argv[ndx]) << '\n'; std::cout << "argv[" << argc << "] == " << static_cast<void*>(argv[argc]) << '\n'; /* ... */ return argc == 3 ? EXIT_SUCCESS : EXIT_FAILURE; // valor de retorno opcional }
Salida posible:
argc == 3 argv[0] == "./convert" argv[1] == "table_in.dat" argv[2] == "table_out.dat" argv[3] == 0
Referencias
| Contenido extendido |
|---|
|
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| CWG 1003 | C++98 |
los nombres de parámetros admitidos de
main
estaban excesivamente restringidos
|
se admiten todos los nombres de parámetros
válidos |
| CWG 1886 | C++98 |
la función
main
podía declararse con un enlace de lenguaje
|
prohibido |
| CWG 2479 | C++20 |
la función
main
podía declararse
consteval
|
prohibido |
| CWG 2811 | C++98 |
no estaba claro si la función
main
se utiliza después de
N3214
|
se considera utilizada cuando se nombra |
Véase también
|
Documentación de C
para
main
function
|