2010-11-09 31 views
11

¿Por qué, si escribo¿Por qué la devolución 0 es opcional?

int main() 
{ 
    //... 
} 

puedo no necesita escribir return 0; al final de la función main? ¿El compilador lo hace por mí?

Uso GCC/C99.

+0

Relacionados: http://stackoverflow.com/questions/204476/what-should-main-return-inc-c- – jball

+1

En general, querrá recordar sus declaraciones de devolución. Si solo escribe pequeños programas para usted, probablemente no tenga problemas. Pero si escribe programas grandes o combina muchos diferentes, es bueno que las interfaces se comporten como se espera. Cuando un programa devuelve 0, significa que terminó con éxito, otros valores indican error. Depender de las funciones específicas del compilador/plataforma para mantener su código funcionando puede ocasionar problemas. –

Respuesta

14

El más reciente C (en la actualidad eso es C99 con algunas modificaciones) devuelve 0 de main por defecto si no hay una instrucción de retorno explícita al final de la función, y el control de los flujos de final de la función (véase 5.1.2.2. 3 en C99 TC3). Esto se debe a que la mayoría de las veces uno escribiría tal forma de retorno de todos modos.

En C89 necesita devolver algo allí, no tiene un retorno tan implícito. Pero el compilador de ninguna manera está obligado a diagnosticar un error de este tipo (consulte 3.6.6.4 en C89 draft y 6.9.1/12 en C99 TC3).

-1

Básicamente, sí. No es necesario que las funciones devuelvan nada, incluso si declaran un tipo de devolución que no sea void. El valor devuelto será indefinido.

Tenga en cuenta que C99 requiere que las funciones que declaran tipos de devolución que no son void siempre finalicen al presionar una declaración de retorno. Entonces, si compila con el modo C99 de su compilador, este código generará un error en tiempo de compilación.

+0

¿Puede vincular a la parte apropiada del estándar C99 para confirmar esto? Parece contradecir la respuesta de Johannes Schaub - litb. –

+0

No, es al revés –

+0

Estaba leyendo desde aquí, que dice que es parte de la especificación C99. En realidad, no revisé la especificación yo mismo. http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr240.htm – cdhowie

18

C99 y C++ caso especial la función main para devolver 0 si el control llega al final sin un retorno explícito. Este solo se aplica a la función main.

El bit correspondiente de la especificación C99 es 5.1.2.2.3 para el caso especial main

5.1.2.2.3 terminación Programa

Si el tipo de retorno de la función principal es un tipo compatible con int, un retorno de la llamada inicial a la función principal es equivalente a llamar la función de salida con el valor
devuelto por la función principal como su argumento ; llegar a la } que termina la función principal vuelve un valor de 0.

6.9.1/12

Si el } que termina una función se alcanzado, y el valor de la llamada de función es utilizado por la persona que llama, el comportamiento no está definido.

Puede probar esto con gcc:

int foo (void) { } 
int main(void) { } 

C89 modo (errores para ambas funciones):

sandiego:$ gcc src/no_return.c -std=c89 -Wall 
src/no_return.c: In function ‘main’: 
src/no_return.c:2: warning: control reaches end of non-void function 
src/no_return.c: In function ‘foo’: 
src/no_return.c:1: warning: control reaches end of non-void function 

C99 modo (principal es un caso especial):

sandiego:$ gcc src/no_return.c -std=c99 -Wall 
src/no_return.c: In function ‘foo’: 
src/no_return.c:1: warning: control reaches end of non-void function 
1

Sí. main en C es una función muy especial que tiene algunas reglas adicionales. Vea el párrafo en la norma C99 sobre su finalización a continuación. En esencia, dice que si abandona la función sin devolver un valor, esto es equivalente a como si hubiera dado un valor de retorno de 0. Esto es especial para main, y lo hace con otras funciones en las que la función de llamada espera que un valor de retorno pueda bloquear su programa (y lo hará).

Si el tipo de retorno de la función principal es un tipo compatible con int, un retorno de la llamada inicial a la función principal es equivalente a llamar a la función de salida con el valor devuelto por el principal funciona como su argumento; al llegar a} que finaliza la función principal devuelve un valor de 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.

Cuestiones relacionadas