¿Cuál es la declaración adecuada de main en C++?

8 minutos de lectura

¿Cual es la declaracion adecuada de main en C
fredodesbordamiento

Preguntas

  • ¿Cuál es la firma adecuada del main función en C++?

  • ¿Cuál es el tipo de retorno correcto y qué significa devolver un valor de main?

  • ¿Cuáles son los tipos de parámetros permitidos y cuáles son sus significados?

  • ¿Es esto específico del sistema?

  • ¿Han cambiado esas reglas con el tiempo?

  • ¿Qué pasa si las violo?

  • Esto está muy relacionado con, o es un duplicado de, ¿Qué debería main volver en C y C++.

    –Jonathan Leffler

    17 mayo 2014 a las 20:02

  • @JonathanLeffler No es broma… se agregó a la lista de duplicados en la revisión 6 hace aproximadamente 8 meses.

    – fredo desbordamiento

    18 mayo 2014 a las 10:18

¿Cual es la declaracion adecuada de main en C
james mcnellis

los main La función debe declararse como una 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 colocarse 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 nombradas mainincluidas, entre otras cosas, clases, variables, enumeraciones, funciones miembro y funciones no miembro 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 main función que designa dónde comienza el programa.

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

los main función no se puede utilizar en su programa: no se le permite llamar a la main función desde cualquier parte 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 devolución (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 violada con respecto a la main función).

Hay dos declaraciones de main que debe permitirse:

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

En (1)no hay parámetros.

En (2)hay dos parámetros y se nombran convencionalmente argc y argvrespectivamente. 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 argv formación.

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

Tenga en cuenta que dado que un argumento de tipo matriz (como char*[]) es realmente solo un argumento de tipo puntero disfrazado, las 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 consultar la documentación de su implementación para ver qué admite.

main() se espera que devuelva cero para indicar éxito y distinto de cero para indicar falla. No está obligado a escribir explícitamente un return declaración en main(): si tu dejas main() volver sin un explícito return declaración, es lo mismo que si hubieras escrito return 0;. Los siguientes dos main() Las funciones tienen el mismo comportamiento:

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

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

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

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

  • IIRC, los únicos valores de retorno garantizados son 0, EXIT_SUCCESS (mismo efecto que 0) y EXIT_FAILURE. EDITAR: Ah, está bien, se pueden devolver otros valores de estado distintos de cero, pero con un significado definido por la implementación. Solo se garantiza que EXIT_FAILURE se interprete de alguna manera como un valor de falla.

    – Derrick Turk

    17 de noviembre de 2010 a las 17:24


  • @Synetech: la pregunta es en su primera oración, “¿Cuál es la firma adecuada de la función principal en C++?” y la pregunta está etiquetada como ambos [c++] y [c++-faq]. No puedo evitar que los usuarios de Java o C# (o cualquier otra persona) sigan confundidos. C# requiere Main ser una función miembro estática porque ni siquiera tiene funciones que no sean miembros. Incluso C89 requiere main regresar int. No estoy lo suficientemente familiarizado con K&R C para conocer sus reglas exactas, pero supongo que también requiere main regresar int ya que main sin tipo de retorno era algo común y sin tipo = implícito int en K&R.

    –James McNellis

    21 de diciembre de 2010 a las 20:30

  • @Suhail: porque el lenguaje estándar dice que el tipo de devolución debe ser int.

    –James McNellis

    15 de junio de 2011 a las 16:35

  • @Suhail: Sí. Su código no será C++ correcto y muchos compiladores rechazarán su código.

    –James McNellis

    15 de junio de 2011 a las 18:37

  • @Suhail: Visual C++ permite un void tipo de retorno como una extensión de idioma. Los compiladores que no lo permiten incluyen GCC y Comeau.

    –James McNellis

    15 de junio de 2011 a las 21:08

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

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

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

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

Espero que ayude..

  • ¿Hay algún motivo específico por el que el tipo de devolución de main debiera ser int ?

    – Suhail Gupta

    15 de junio de 2011 a las 12:01

  • @SuhailGupta: Para que el proceso de llamada sepa si esta el proceso debe considerarse exitoso o no. Permitiendo void rompe ese modelo. Ni siquiera tiene sentido si significara “siempre considerar el éxito”. Debido a que no tenía forma de decir si el proceso realmente falló, también lo hizo. De Verdad ¿triunfar? Sin retorno int.

    – Carreras de ligereza en órbita

    2 de enero de 2017 a las 13:55

El texto exacto del último estándar publicado (C++14) es:

Una implementación debe permitir tanto

  • una función de () regresando int y

  • una función de (intpuntero a puntero a char) regresando int

como el tipo de main.

Esto deja en claro que se permiten grafías alternativas siempre que el tipo de main es el tipo int() o int(int, char**). Así que también están permitidos los siguientes:

  • int main(void)
  • auto main() -> int
  • int main ( )
  • signed int main()
  • typedef char **a; typedef int b, e; e main(b d, a c)

  • NÓTESE BIEN. Publiqué esta respuesta como en comentarios a otro hilo, alguien trató de citar este hilo como evidencia de que int main(void) no era correcto en C++.

    –MM

    1 de julio de 2017 a las 9:22

  • @Stargateur auto main() -> int no tiene un tipo de retorno deducido. Preste atención al { en “(auto main() {… no está permitido)” y aprenda a saber cuándo aún no sabe lo suficiente como para agregar algo significativo.

    usuario743382

    1 de julio de 2017 a las 9:44


1647535029 528 ¿Cual es la declaracion adecuada de main en C
piedrametal

Los dos principales válidos 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.

1647535030 251 ¿Cual es la declaracion adecuada de main en C
ben voigt

Detalles sobre los valores de retorno y su significado

Según 3.6.1 ([basic.start.main]):

Una declaración de devolución en main tiene el efecto de dejar el main Función (destruir cualquier objeto con duración de almacenamiento automático) y llamar std::exit con el valor devuelto como argumento. Si el control llega al final de main sin encontrar un return sentencia, el efecto es el de ejecutar

return 0;

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

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad