Namespaces
Variants

Main function

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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)
1) Una función main que se ejecuta independientemente de los argumentos proporcionados por el entorno.
2) Una función main que acepta argumentos proporcionados por el entorno.
Los nombres de argc y argv son arbitrarios, así como la representación de los tipos de los parámetros: int main ( int ac, char ** av ) es igualmente válido.
3) Una función main de tipo definido por la implementación, que retorna int .
El estándar de C++ recomienda que las implementaciones definan funciones 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:

1) El cuerpo de la función 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 ; .
2) La ejecución del return (o el return implícito al alcanzar el final de 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):

1) No puede ser nombrado en ningún lugar del programa
a) en particular, no puede ser llamado recursivamente
b) no se puede tomar su dirección
c) no puede ser usado en una expresión typeid o un especificador decltype (desde C++11)
2) No puede ser predefinida y no puede ser sobrecargada: efectivamente, el nombre 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).
3) No puede ser definido como eliminado o (since C++11) declarado con ningún tipo de vinculación de lenguaje , 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)
5) La función main no puede ser una coroutine .
6) La función main no puede adjuntarse a un module con nombre.
(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
  • Estándar C++23 (ISO/IEC 14882:2024):
  • 6.9.3.1 Función main [basic.start.main]

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