¿Cuál es la declaración apropiada de main?


¿Cuál es la firma apropiada de la función main en C++? ¿Cuál es el tipo de retorno correcto y qué significa devolver un valor desde main? ¿Cuáles son los tipos de parámetros permitidos y cuáles son sus significados?

Es este sistema específico? ¿Han cambiado esas reglas con el tiempo? ¿Qué pasa si las violo?

Author: James McNellis, 2010-11-17

5 answers

La función main debe declararse como función no miembro en el espacio de nombres global. Esto significa que no puede ser una función miembro estática o no estática de una clase, ni puede ser colocada en un espacio de nombres (incluso el espacio de nombres sin nombre).

El nombre main no está reservado en C++ excepto como una función en el espacio de nombres global. Usted es libre de declarar otras entidades llamadas main, incluyendo, entre otras cosas, clases, variables, enumeraciones, funciones miembro y no miembro funciones que no están en el espacio de nombres global.

Puede declarar una función llamada main como una función miembro o en un espacio de nombres, pero tal función no sería la función main que designa dónde se inicia el programa.

La función main no se puede declarar como static o inline. Tampoco se puede sobrecargar; solo puede haber una función llamada main en el espacio de nombres global.

La función main no se puede usar en su programa: no se le permite llamar a la función main funciona desde cualquier lugar de su código, ni se le permite tomar su dirección.

El tipo de retorno de main debe ser int. No se permite ningún otro tipo de retorno (esta regla está en negrita porque es muy común ver programas incorrectos que declaran main con un tipo de retorno de void; esta es probablemente la regla más frecuentemente violada con respecto a la función main).

Hay dos declaraciones de main que deben ser permitidas: {[43]]}

int main()               // (1)
int main(int, char*[])   // (2)

En (1), no hay parámetros.

En (2), hay dos parámetros y que son convencionalmente denominado argc y argv, respectivamente. argv es un puntero a una matriz de cadenas C que representan los argumentos del programa. argc es el número de argumentos en el array argv.

Normalmente, argv[0] contiene el nombre del programa, pero no siempre es así. Se garantiza que argv[argc] es un puntero nulo.

Tenga en cuenta que desde un argumento de tipo de matriz (como char*[]) es realmente solo un argumento de tipo puntero disfrazado, los dos siguientes son formas válidas de escribir (2) y ambos significan exactamente lo mismo:

int main(int argc, char* argv[])
int main(int argc, char** argv)

Algunas implementaciones pueden permitir otros tipos y números de parámetros; tendría que revisar la documentación de su implementación para ver qué soporta.

main() se espera que devuelva cero para indicar el éxito y no cero para indicar el fracaso. Usted no está obligado a escribir explícitamente un return declaración en main(): si dejas que main() regrese sin una declaración explícita return, es lo mismo que si hubieras escrito return 0;. Las siguientes dos funciones main() tienen el mismo comportamiento:

int main() { }
int main() { return 0; }

Hay dos macros, EXIT_SUCCESS y EXIT_FAILURE, definidas en <cstdlib> que también se pueden devolver desde main() para indicar éxito y fracaso, respectivamente.

El valor devuelto por main() se pasa a la función exit(), que termina el programa.

Tenga en cuenta que todo esto se aplica solo cuando se compila para un entorno alojado (informalmente, un entorno donde tiene una biblioteca estándar completa y hay un sistema operativo ejecutando su programa). También es posible compilar un programa C++ para un entorno independiente (por ejemplo, algunos tipos de sistemas embebidos), en cuyo caso el inicio y la terminación están totalmente definidos por la implementación y una función main() puede ni siquiera ser necesaria. Sin embargo, si está escribiendo C++ para un sistema operativo de escritorio moderno, está compilando para ambiente.

 165
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 18:24:18

De los documentos estándar., 3.6.1.2 Función principal ,

Tendrá un retorno tipo de tipo int, pero por lo demás su tipo está definido por la implementación. Todas las implementaciones permitirán lo siguiente: definiciones de main:

int main() { / ... / } y int main(int argc, char* argv[]) { / ... / }

En la última forma argc será el número de argumentos pasados al programa desde el entorno en el que la se ejecuta el programa.Si argc es distinto de cero estos argumentos se suministrará en argv [0] a través de argv [argc-1] como punteros a los caracteres iniciales de cadenas multibyte terminadas en cero .....

Espero que eso ayude..

 12
Author: liaK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-18 05:21:18

La redacción exacta del último estándar publicado (C++14) es:

Una aplicación permitirá tanto{[15]]}

  • Una función de () devolver int y

  • Una función de (int, puntero a puntero a char) regresar int

Como el tipo de main.

Esto deja claro que se permiten ortografías alternativas siempre que el tipo de main sea el tipo int() o int(int, char**). Así que los siguientes son también permitido:

  • int main(void)
  • auto main() -> int
  • int main ( )
  • signed int main()
  • typedef char **a; typedef int b, e; e main(b d, a c)
 3
Author: M.M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-01 09:22:40

Las dos principales válidas son int main() y int main(int, char*[]). Cualquier otra cosa puede o no compilar. Si main no devuelve explícitamente un valor, 0 se devuelve implícitamente.

 3
Author: stonemetal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-23 15:31:07

Detalles sobre los valores de retorno y su significado

Per 3.6.1 ([basic.start.main]):

Una sentencia return en main tiene el efecto de dejar la función main (destruyendo cualquier objeto con duración de almacenamiento automática) y llamar a std::exit con el valor devuelto como argumento. Si control llega al final de main sin encontrar una instrucción return, el efecto es el de ejecutar

return 0;

El comportamiento de std::exit se detalla en la sección 18.5 ([support.start.term]), y describe el código de estado:

Finalmente, el control se devuelve al entorno host. Si el estado es cero o EXIT_SUCCESS, se devuelve una forma definida por la implementación del estado de terminación exitosa. Si status es EXIT_FAILURE, se devuelve una forma definida por la implementación de la terminación fallida de status. De lo contrario, el estado devuelto está definido por la implementación.

 2
Author: Ben Voigt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-02 02:46:11