Pregunta ¿Qué debería main () devolver en C y C ++?


¿Cuál es la forma correcta (más eficiente) de definir el main() función en C y C ++ - int main() o void main() - ¿y por qué? Si int main() entonces return 1 o return 0?


Existen numerosos duplicados de esta pregunta, que incluyen:

Relacionado:


549
2017-10-15 12:13


origen


Respuestas:


El valor de retorno para main debe indicar cómo salió el programa. La salida normal generalmente se representa con un valor de retorno 0 de main. La terminación anormal generalmente se señala mediante un retorno distinto de cero, pero no existe un estándar para la interpretación de códigos que no sean cero. También según lo observado por otros, void main() está explícitamente prohibido por el estándar de C ++ y no debe utilizarse. El C ++ válido main las firmas son:

int main()

y

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

que es equivalente a

int main(int argc, char** argv)

También vale la pena señalar que en C ++, int main() puede dejarse sin un valor de retorno, en cuyo punto se establece por defecto el retorno 0. Esto también es cierto con un programa C99. Si el retorno 0 debe omitirse o no está abierto al debate. El rango de firmas principales válidas del programa C es mucho mayor.

Además, la eficiencia no es un problema con el main función. Solo se puede ingresar y dejar una vez (marcando el inicio y la terminación del programa) de acuerdo con el estándar de C ++. Para C, el caso es diferente y el reingreso main() está permitido, pero probablemente debería evitarse.


466
2017-10-15 12:16



La respuesta aceptada parece estar dirigida a C ++, así que pensé que agregaría una respuesta que pertenece a C, y esto difiere de varias maneras.

ISO / IEC 9899: 1989 (C90):

main() debe declararse como:

int main(void)
int main(int argc, char **argv)

O equivalente. Por ejemplo, int main(int argc, char *argv[]) es equivalente a la segunda. Además, el int el tipo de devolución se puede omitir ya que es un valor predeterminado.

Si una implementación lo permite, main() puede declararse de otras maneras, pero esto hace que la implementación del programa se defina y ya no se ajuste estrictamente.

El estándar define 3 valores para el retorno que son estrictamente conformes (es decir, no se basa en el comportamiento definido por la implementación): 0 y EXIT_SUCCESS para una finalización exitosa, y EXIT_FAILURE por una terminación sin éxito. Cualquier otro valor no es estándar y la implementación está definida. main() debe tener un explícito return declaración al final para evitar un comportamiento indefinido.

Por último, no hay nada de malo desde el punto de vista de las normas con las llamadas main()de un programa.

ISO / IEC 9899: 1999 (C99):

Para C99, todo es igual que el anterior excepto que:

  • los int el tipo de retorno no puede ser omitido.
  • Puede omitir la declaración de devolución de main(). Si lo haces, y main() terminado, hay un implícito return 0.

137
2017-10-16 09:59



Estándar C - Entorno hospedado

Para un entorno alojado (ese es el normal), el estándar C11 (ISO / IEC 9899: 2011) dice:

5.1.2.2.1 Inicio del programa

La función llamada al inicio del programa se llama main. La implementación no declara   prototipo para esta función. Se definirá con un tipo de devolución de int y sin   parámetros:

int main(void) { /* ... */ }

o con dos parámetros (a los que se hace referencia aquí argc y argv, aunque cualquier nombre puede ser   utilizado, ya que son locales a la función en la que están declarados):

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

o equivalente;10) o de alguna otra manera definida por la implementación.

Si se declaran, los parámetros de la función principal obedecerán a los siguientes   restricciones:

  • El valor de argc será no negativo
  • argv[argc] será un puntero nulo.
  • Si el valor de argc es mayor que cero, los miembros de la matriz argv[0] mediante    argv[argc-1] inclusive debe contener punteros a las cadenas, que se dan   valores definidos por la implementación por el entorno de host antes del inicio del programa. los   La intención es proporcionar a la información del programa determinada antes del inicio del programa   desde otro lugar en el entorno alojado. Si el entorno de host no es capaz de   suministrando cadenas con letras en mayúsculas y minúsculas, la implementación   se asegurará de que las cadenas se reciban en minúsculas.
  • Si el valor de argc es mayor que cero, la cadena apuntada por argv[0]   representa el nombre del programa; argv[0][0] será el carácter nulo si el   el nombre del programa no está disponible desde el entorno host. Si el valor de argc es   más grande que uno, las cuerdas apuntadas por argv[1] mediante argv[argc-1]   representar los parámetros del programa.
  • Los parametros argc y argv y las cuerdas apuntadas por el argv matriz deberá   ser modificable por el programa, y ​​retener sus últimos valores almacenados entre programa   inicio y finalización del programa.

10) Así, int puede ser reemplazado por un nombre typedef definido como int, o el tipo de argv Se puede escribir como    char **argv, y así.

Terminación del programa en C99 o C11

El valor devuelto main() se transmite al 'entorno' de una manera definida por la implementación.

5.1.2.2.3 Terminación del programa

1 Si el tipo de devolución del main la función es un tipo compatible con int, un regreso de la   llamada inicial al main función es equivalente a llamar al exit funcionar con el valor   devuelto por el main funcionar como su argumento;11) alcanzando el } eso termina el    main función devuelve un valor de 0. Si el tipo de devolución no es compatible con int, el   el estado de terminación devuelto al entorno de host no está especificado.

11)De acuerdo con 6.2.4, la vida útil de los objetos con duración de almacenamiento automática declarada en main   habrán terminado en el primer caso, incluso donde no tendrían en el segundo.

Tenga en cuenta que 0 tiene el mandato de 'éxito'. Puedes usar EXIT_FAILURE y EXIT_SUCCESS de <stdlib.h> si lo prefiere, pero 0 está bien establecido, y lo es 1. Ver también Códigos de salida mayores que 255 - ¿posible?.

En C89 (y, por lo tanto, en Microsoft C), no hay ninguna declaración sobre lo que sucede si el main() la función regresa pero no especifica un valor de retorno; por lo tanto, conduce a un comportamiento indefinido.

7.22.4.4 El exit función

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

Estándar C ++ - Entorno hospedado

El estándar C ++ 11 (ISO / IEC 14882: 2011) dice:

3.6.1 Función principal [basic.start.main]

¶1 Un programa debe contener una función global llamada main, que es el inicio designado del programa. [...]

¶2 Una implementación no debe predefinir la función principal. Esta función no debe estar sobrecargada. Deberá   tiene un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación.   Todas las implementaciones   permitirá ambas de las siguientes definiciones de principal:

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 se ejecuta el programa Si argc es distinto de cero estos argumentos se suministrarán en argv[0]   mediante argv[argc-1] como punteros a los caracteres iniciales de cadenas multibyte terminadas en nulo (NTMBS) (17.5.2.1.4.2) y argv[0] será el puntero al carácter inicial de un NTMBS que representa el   nombre utilizado para invocar el programa o "". El valor de argc debe ser no negativo. El valor de argv[argc]   debe ser 0. [Nota: se recomienda añadir cualquier parámetro adicional (opcional) después argv. -fin   Nota ]

¶3 La función main no se usará dentro de un programa. El enlace (3.5) de main está definido por la implementación. [...]

¶5 Una declaración de retorno en main tiene el efecto de dejar la función principal (destruir cualquier objeto con   duración de almacenamiento) y llamadas std::exit con el valor de retorno como argumento Si el control llega al final   de main sin encontrar una instrucción return, el efecto es el de ejecutar

return 0;

El estándar de C ++ dice explícitamente que "[la función principal] tendrá un tipo de retorno de tipo int, pero de lo contrario su tipo es implementación definida ", y requiere las mismas dos firmas como el estándar C para ser admitido como opciones. Entonces un 'void main ()' no está directamente permitido por el estándar C ++, aunque no hay nada que pueda hacer detener una implementación no estándar que permite alternativas. Tenga en cuenta que C ++ prohíbe al usuario llamar main(pero el estándar C no).

Hay un párrafo de §18.5 Inicio y finalización en el estándar C ++ 11 que es idéntico al párrafo de §7.22.4.4 los exit función en el estándar C11 (citado anteriormente), aparte de una nota al pie (que simplemente documenta que EXIT_SUCCESS y EXIT_FAILURE están definidos en <cstdlib>)

Estándar C - Extensión común

Clásicamente, los sistemas Unix admiten una tercera variante:

int main(int argc, char **argv, char **envp) { ... }

El tercer argumento es una lista de punteros terminados en nulo para cadenas, cada una de las cuales es una variable de entorno que tiene un nombre, un signo igual y un valor (posiblemente vacío). Si no lo usas, puedes llegar al medio ambiente a través de 'extern char **environ;'. Durante mucho tiempo, eso no tenía un encabezado que lo declarara, pero el POSIX La norma 2008 ahora requiere que se declare en <unistd.h>.

Esto es reconocido por el estándar C como una extensión común, documentada en el Anexo J:

J.5.1 Argumentos del entorno

¶1 En un entorno alojado, la función principal recibe un tercer argumento, char *envp[],   que apunta a una matriz de punteros terminados en nulo para char, cada uno de los cuales apunta a una cadena   que proporciona información sobre el entorno para esta ejecución del programa (5.1.2.2.1).

Microsoft C

los Microsoft VS 2010 compilador es interesante. El sitio web dice:

La sintaxis de declaración para main es

 int main();

u, opcionalmente,

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

Alternativamente, el main y wmain las funciones pueden declararse como retornadas void (sin valor de retorno). Si declaras main o wmain como devolución vacía, no puede devolver un código de salida al proceso principal o al sistema operativo mediante el uso de una declaración de devolución. Para devolver un código de salida cuando main o wmain se declara como void, debes usar el exit función.

No me queda claro qué sucede (qué código de salida se devuelve al padre o al SO) cuando un programa con void main() sale, y el sitio web de MS también está en silencio.

Curiosamente, MS no prescribe la versión de dos argumentos de main() que requieren los estándares C y C ++. Solo prescribe una forma de tres argumentos donde el tercer argumento es char **envp, un puntero a una lista de variables de entorno.

La página de Microsoft también enumera algunas otras alternativas: wmain() que toma cadenas de caracteres anchas, y algunas más.

El Microsoft Visual Studio 2005 versión de esta página no lista void main() como alternativa. los versiones de Microsoft Visual Studio 2008 en adelante hacer.

Estándar C - Ambiente independiente

Como se señaló al principio, los requisitos anteriores se aplican a los entornos alojados. Si está trabajando con un entorno independiente (que es la alternativa a un entorno alojado), entonces el estándar tiene mucho menos que decir. Para un entorno independiente, la función llamada al inicio del programa no necesita ser llamada main y no hay restricciones en su tipo de devolución. El estándar dice:

5.1.2 Entornos de ejecución

Se definen dos entornos de ejecución: independientes y alojados. En ambos casos,   el inicio del programa ocurre cuando la ejecución llama a una función C designada   ambiente. Todos los objetos con duración de almacenamiento estática deberán inicializarse (establecerse en sus valores iniciales) antes del inicio del programa. La manera y el momento de tal inicialización no están especificados. La terminación del programa devuelve el control al entorno de ejecución.

5.1.2.1 Entorno independiente

En un entorno independiente (en el que la ejecución del programa C puede tener lugar sin ningún beneficio de un sistema operativo), el nombre y el tipo de la función llamada al inicio del programa están definidos por la implementación. Cualquier instalación de biblioteca disponible para un programa independiente, que no sea el conjunto mínimo requerido por la cláusula 4, está definida por la implementación.

El efecto de la finalización del programa en un entorno independiente está definido por la implementación.

La referencia cruzada a la cláusula 4 Conformidad se refiere a esto:

¶5 A programa estrictamente conforme usará solo aquellas características del idioma y la biblioteca especificadas en esta norma internacional.3) No producirá salida dependiente de ningún comportamiento indeterminado, indefinido o definido por la implementación, y no deberá exceder ningún límite mínimo de implementación.

¶6 Las dos formas de implementación conforme son alojado y de pie. UN conformando la implementación alojada aceptará cualquier programa estrictamente conforme. UN conformación de implementación independiente aceptará cualquier programa estrictamente conforme en el que el uso de las características especificadas en la cláusula de la biblioteca (cláusula 7) se limite al contenido de los encabezados estándar <float.h>, <iso646.h>, <limits.h>, <stdalign.h>,    <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>y    <stdnoreturn.h>. Una implementación conforme puede tener extensiones (incluidas   funciones adicionales de la biblioteca), siempre que no alteren el comportamiento de ningún programa estrictamente conforme.4)

¶7 A programa conforme es uno que es aceptable para una implementación conforme.5)

3) Un programa de estricto cumplimiento puede usar características condicionales (ver 6.10.8.3) siempre que el uso esté protegido por una directiva de preprocesamiento de inclusión condicional apropiada utilizando la macro relacionada. Por ejemplo:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif

4) Esto implica que una implementación conforme no reserva identificadores distintos a los explícitamente reservados en esta Norma Internacional.

5) Los programas estrictamente conformes están destinados a ser totalmente portátiles entre implementaciones conformes. Los programas conformes pueden depender de características no portátiles de una implementación conforme.

Es notable que el único encabezado requerido de un entorno independiente que realmente define cualquier función es <stdarg.h> (e incluso esos pueden ser, y a menudo lo son, solo macros).

Estándar C ++ - Ambiente independiente

Del mismo modo que el estándar C reconoce tanto el entorno alojado como el independiente, también lo hace el estándar C ++. (Citas de ISO / IEC 14882: 2011).

1.4 Cumplimiento de la implementación [intro.comliance]

¶7 Se definen dos tipos de implementaciones: a implementación alojada y un implementación independiente. Para una implementación alojada, esta Norma Internacional define el conjunto de bibliotecas disponibles. Una independiente   la implementación es aquella en la que la ejecución puede tener lugar sin el beneficio de un sistema operativo, y tiene un conjunto de bibliotecas definido por la implementación que incluye ciertas bibliotecas de soporte de lenguaje (17.6.1.3).

¶8 Una implementación conforme puede tener extensiones (incluidas funciones de biblioteca adicionales), siempre que no alteren el comportamiento de ningún programa bien formado. Se requieren implementaciones para diagnosticar programas que   use tales extensiones que estén mal formadas de acuerdo con este Estándar Internacional. Sin embargo, una vez hecho esto, pueden compilar y ejecutar dichos programas.

¶9 Cada implementación debe incluir documentación que identifique todas las construcciones condicionalmente admitidas que no admite y define todas las características específicas de la configuración regional.3

3) Esta documentación también define el comportamiento definido por la implementación; ver 1.9.

17.6.1.3 Implementaciones autónomas [cumplimiento]

Se definen dos tipos de implementaciones: alojado y autónomo (1.4). Para una implementación alojada, esta Norma Internacional describe el conjunto de encabezados disponibles.

Una implementación independiente tiene un conjunto de encabezados definido por la implementación. Este conjunto debe incluir al menos los encabezados que se muestran en la Tabla 16.

La versión suministrada del encabezado <cstdlib> declarará al menos las funciones abort, atexit, at_quick_exit, exity quick_exit (18.5). Los otros encabezados enumerados en esta tabla deberán cumplir los mismos requisitos que para una implementación alojada.

Tabla 16: encabezados C ++ para implementaciones independientes

Subclause                           Header(s)
                                    <ciso646>
18.2  Types                         <cstddef>
18.3  Implementation properties     <cfloat> <limits> <climits>
18.4  Integer types                 <cstdint>
18.5  Start and termination         <cstdlib>
18.6  Dynamic memory management     <new>
18.7  Type identification           <typeinfo>
18.8  Exception handling            <exception>
18.9  Initializer lists             <initializer_list>
18.10 Other runtime support         <cstdalign> <cstdarg> <cstdbool>
20.9  Type traits                   <type_traits>
29    Atomics                       <atomic>

¿Qué tal usar int main() ¿Cª?

El estándar §5.1.2.2.1 del estándar C11 muestra la notación preferida -int main(void) - pero también hay dos ejemplos en el estándar que muestran int main(): §6.5.3.4 ¶8 y §6.7.6.3 ¶20. Ahora, es importante observar que los ejemplos no son 'normativos'; ellos son solo ilustrativos. Si hay errores en los ejemplos, no afectan directamente el texto principal del estándar. Dicho esto, son muy indicativos del comportamiento esperado, por lo que si el estándar incluye int main() en un ejemplo, sugiere que int main() no está prohibido, incluso si no es la notación preferida.

6.5.3.4 El sizeof y _Alignof operadores

...

¶8 EJEMPLO 3 En este ejemplo, el tamaño de una matriz de longitud variable se calcula y devuelve de una función:

#include <stddef.h>

size_t fsize3(int n)
{
    char b[n+3]; // variable length array
    return sizeof b; // execution time sizeof
}
int main()
{
    size_t size;
    size = fsize3(10); // fsize3 returns 13
    return 0;
}

98
2017-09-10 14:15



Yo creo eso main() debe regresar ya sea EXIT_SUCCESS o EXIT_FAILURE. Ellos están definidos en stdlib.h


56
2017-10-15 12:33



Devuelve 0 en caso de éxito y no cero en error. Este es el estándar utilizado por los scripts de UNIX y DOS para averiguar qué sucedió con su programa.


27
2017-10-15 12:16



Tenga en cuenta que los estándares C y C ++ definen dos tipos de implementaciones: independiente y alojada.

  • Entorno alojado C90

    Formas permitidas 1:

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */
    

    Comentarios:

    Los dos primeros se declaran explícitamente como los formularios permitidos, los demás se permiten implícitamente porque C90 permitió "int implícito" para el tipo de retorno y los parámetros de la función. No se permite ninguna otra forma.

  • Entorno independiente C90

    Cualquier forma o nombre de main está permitido 2.

  • Entorno alojado C99

    Formas permitidas 3:

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    

    Comentarios:

    C99 eliminó "implicit int" por lo main() ya no es válido.

    Se ha introducido una oración extraña y ambigua "o de alguna otra manera definida por la implementación". Esto puede interpretarse como "los parámetros para int main() puede variar "o como" main puede tener cualquier forma definida por la implementación ".

    Algunos compiladores han elegido interpretar el estándar de la última manera. Podría decirse que no se puede afirmar fácilmente que no se están ajustando estrictamente al citar el estándar en sí mismo, ya que es ambiguo.

    Sin embargo, para permitir formas completamente salvajes de main() Probablemente (?) no era la intención de esta nueva oración. El razonamiento C99 (no normativo) implica que la oración se refiere a parámetros adicionales para int main  4.

    Sin embargo, la sección para la terminación del programa de entorno alojado continúa argumentando sobre el caso donde main no devuelve int 5. Aunque esa sección no es normativa sobre cómo se debe declarar main, definitivamente implica que main podría declararse de una manera completamente definida por la implementación incluso en sistemas alojados.

  • Ambiente independiente C99

    Cualquier forma o nombre de main está permitido 6.

  • Entorno alojado C11

    Formas permitidas 7:

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    
  • C11 ambiente independiente

    Cualquier forma o nombre de main está permitido 8.


Tenga en cuenta que int main() nunca se incluyó en la lista como un formulario válido para ninguna implementación alojada de C en ninguna de las versiones anteriores. En C, a diferencia de C ++, () y (void) tener diferentes significados El primero es una característica obsoleta que puede eliminarse del idioma. Vea las direcciones futuras del lenguaje C11:

6.11.6 Declaradores de funciones

El uso de declaradores de función con paréntesis vacíos (no declaradores de tipo de parámetro de formato prototipo) es una característica obsoleta.


  • C ++ 03 entorno alojado

    Formas permitidas 9:

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

    Comentarios:

    Tenga en cuenta el paréntesis vacío en la primera forma. C ++ y C son diferentes en este caso, porque en C ++ esto significa que la función no toma parámetros. Pero en C significa que puede tomar cualquier parámetro.

  • C ++ 03 entorno independiente

    El nombre de la función llamada al inicio está definido por la implementación. Si se llama main() debe seguir las formas establecidas 10:

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    
  • C ++ 11 entorno alojado

    Formas permitidas 11:

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

    Comentarios:

    El texto del estándar ha sido cambiado pero tiene el mismo significado.

  • C ++ 11 entorno independiente

    El nombre de la función llamada al inicio está definido por la implementación. Si se llama main() debe seguir las formas establecidas 12:

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    

Referencias

  1. ANSI X3.159-1989 2.1.2.2 Entorno hospedado. "Inicio del programa"

    La función llamada al inicio del programa se llama main. los   implementación no declara ningún prototipo para esta función. Será   definido con un tipo de retorno de int y sin parámetros:

    int main(void) { /* ... */ } 
    

    o con dos parámetros (a los que se hace referencia aquí   argc y argv, aunque se pueden usar todos los nombres, ya que son locales al   función en la que están declarados):

    int main(int argc, char *argv[]) { /* ... */ }
    
  2. ANSI X3.159-1989 2.1.2.1 Entorno independiente:

    En un entorno independiente (en el que la ejecución del programa C puede tomar   lugar sin ningún beneficio de un sistema operativo), el nombre y tipo   de la función llamada al inicio del programa están definidas por la implementación.

  3. ISO 9899: 1999 5.1.2.2 Entorno hospedado -> 5.1.2.2.1 Inicio del programa

    La función llamada al inicio del programa se llama main. los   implementación no declara ningún prototipo para esta función. Será   definido con un tipo de retorno de int y sin parámetros:

    int main(void) { /* ... */ } 
    

    o con dos parámetros (a los que se hace referencia aquí   argc y argv, aunque se pueden usar todos los nombres, ya que son locales al   función en la que están declarados):

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

    o equivalente; 9) o en alguna otra implementación definida   manera.

  4. Justificación del estándar internacional - Lenguajes de programación - C, Revisión 5.10. 5.1.2.2 Entorno hospedado -> 5.1.2.2.1 Inicio del programa

    El comportamiento de los argumentos a main, y de la interacción de exit, main y atexit   (ver §7.20.4.2) ha sido codificado para frenar una variedad no deseada en la representación de argv   cadenas, y en el significado de los valores devueltos por main.

    La especificación de argc y argv como argumentos principales reconoce una extensa práctica previa.   argv [argc] debe ser un puntero nulo para proporcionar una verificación redundante para el final de la lista, también sobre la base de la práctica común.

    main es la única función que puede ser declarada portablemente con cero o dos argumentos. (El número de argumentos de otras funciones debe coincidir exactamente entre la invocación y la definición).   Este caso especial simplemente reconoce la práctica generalizada de dejar los argumentos en main cuando el programa no accede a las cadenas de argumentos del programa. Si bien muchas implementaciones admiten más de dos argumentos para main, dicha práctica no está bendecida ni prohibida por el Estándar; un programa que define main con tres argumentos no es estrictamente conforme (ver §J.5.1.).

  5. ISO 9899: 1999 5.1.2.2 Entorno hospedado -> 5.1.2.2.3 Terminación del programa

    Si el tipo de retorno de la función principal es un tipo compatible con int, un retorno desde la llamada inicial a la función principal equivale a llamar a la función de salida con el valor devuelto por la función principal como argumento; 11) llegar al } que finaliza la función principal devuelve un valor de 0. Si el tipo de devolución no es compatible con int, el estado de terminación devuelto al entorno de host no está especificado.

  6. ISO 9899: 1999 5.1.2.1 Ambiente autónomo

    En un entorno independiente (en el que la ejecución del programa C puede tener lugar sin ningún beneficio de un sistema operativo), el nombre y el tipo de la función llamada al inicio del programa están definidos por la implementación.

  7. ISO 9899: 2011 5.1.2.2 Entorno hospedado -> 5.1.2.2.1 Inicio del programa

    Esta sección es idéntica a la C99 que se mencionó anteriormente.

  8. ISO 9899: 1999 5.1.2.1 Ambiente autónomo

    Esta sección es idéntica a la C99 que se mencionó anteriormente.

  9. ISO 14882: 2003 3.6.1 Función principal

    Una implementación no debe predefinir la función principal. Esta función no debe estar sobrecargada. Tendrá un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones permitirán ambas de las siguientes definiciones de main:

    int main() { /* ... */ }
    

    y

    int main(int argc, char* argv[]) { /* ... */ }
    
  10. ISO 14882: 2003 3.6.1 Función principal

    Está definido por la implementación si se requiere un programa en un entorno independiente para definir una función principal.

  11. ISO 14882: 2011 3.6.1 Función principal

    Una implementación no debe predefinir la función principal. Esta función no debe estar sobrecargada. Tendrá un tipo de retorno de tipo int, pero de lo contrario su tipo está definido por la implementación. Todas las implementaciones deberán   permitir ambos

    - una función de () devolver int y

    - una función de (int, puntero a puntero a char) que devuelve int

    como el tipo de main (8.3.5).

  12. ISO 14882: 2011 3.6.1 Función principal

    Esta sección es idéntica a la de C ++ 03 citada anteriormente.


25
2017-07-07 08:07



Tenga en cuenta que, aunque está devolviendo un int, algunos sistemas operativos (Windows) truncan el valor devuelto a un solo byte (0-255).


7
2017-10-15 15:22



main() en C89 y K & R C tipos de retorno no especificados por defecto a 'int'.

return 1? return 0?
  1. Si no escribe una declaración de devolución en int main(), el cierre { devolverá 0 por defecto.

  2. return 0 o return 1 será recibido por el proceso principal. En un shell va a una variable de shell, y si está ejecutando su programa desde un shell y no usa esa variable, entonces no necesita preocuparse por el valor de retorno de main().

Ver ¿Cómo puedo obtener lo que mi función principal ha devuelto?.

$ ./a.out
$ echo $?

De esta forma puedes ver que es la variable $? que recibe el byte menos significativo del valor de retorno de main().

En scripting Unix y DOS, return 0 en caso de éxito y normalmente se devuelve un error que no sea cero. Este es el estándar utilizado por las secuencias de comandos de Unix y DOS para averiguar qué sucedió con su programa y controlar todo el flujo.


6
2017-12-27 08:02